[python] “return list.sort ()”가 목록이 아닌 None을 반환하는 이유는 무엇입니까?

findUniqueWords결과가 sorted 인 것을 확인할 수있었습니다 list. 그러나 목록을 반환하지 않습니다. 왜?

def findUniqueWords(theList):
    newList = []
    words = []

    # Read a line at a time
    for item in theList:

        # Remove any punctuation from the line
        cleaned = cleanUp(item)

        # Split the line into separate words
        words = cleaned.split()

        # Evaluate each word
        for word in words:

            # Count each unique word
            if word not in newList:
                newList.append(word)

    answer = newList.sort()
    return answer



답변

list.sort목록을 제자리에 정렬합니다. 즉, 새 목록을 반환하지 않습니다. 그냥 써

newList.sort()
return newList


답변

문제는 여기 있습니다 :

answer = newList.sort()

sort정렬 된 목록을 반환하지 않습니다. 오히려 목록을 제자리에 정렬합니다.

사용하다:

answer = sorted(newList)


답변

다음은 Python의 dev 목록에있는 Guido van Rossum self이 보낸 객체로, 객체에 영향을주는 작업 을 반환 하지 않고 새 항목을 반환하지 않는 이유를 설명합니다 .

이것은 단일 객체에 대한 일련의 부작용을 다음과 같이 연결할 수있는 코딩 스타일 (여러 다른 언어로 인기가 높으며 특히 Lisp가 여기에 해당한다고 생각합니다)에서 비롯됩니다.

 x.compress().chop(y).sort(z)

어느 것과 동일합니다

  x.compress()
  x.chop(y)
  x.sort(z)

체인 형태가 가독성에 위협이된다는 것을 알았습니다. 독자는 각 방법에 대해 잘 알고 있어야합니다. 두 번째 형식은 이러한 각 호출이 동일한 객체에서 작동한다는 것을 명확하게 보여 주므로 클래스와 해당 메서드를 잘 모르더라도 두 번째 및 세 번째 호출이 x에 적용된다는 것을 이해할 수 있습니다. 모든 전화는 부작용으로 인해 발생하지만 다른 것은 아닙니다.

문자열 처리 작업과 같이 새로운 값을 반환하는 작업에 대해 체인을 예약하고 싶습니다.

 y = x.rstrip("\n").split(":").lower()

답변

파이썬 습관적으로 반환 None함수와 같은 데이터를 변이 방법에서 list.sort, list.append그리고 random.shuffle아이디어는 그것이 돌연변이 된 사실을 암시하는 것으로,.

iterable을 가져 와서 정렬 된 새로운 항목 목록을 리턴하려면 sorted내장 함수를 사용하십시오 .


답변

파이썬에는 두 가지 종류의 정렬이 있습니다 : 정렬 메소드 (또는 “멤버 함수”)와 정렬 함수 . sort 메소드는 이름이 지정된 오브젝트의 컨텐츠에 대해 작동합니다. 오브젝트를 다시 정렬하는 조치 로 생각하십시오 . sort 함수는 객체가 나타내는 데이터에 대한 연산 이며 동일한 내용을 가진 새로운 객체를 정렬 된 순서로 반환합니다.

이름 l이 지정된 정수 목록이 주어지면 다음과 같이 호출하면 목록 자체가 재정렬됩니다 l.sort().

>>> l = [1, 5, 2341, 467, 213, 123]
>>> l.sort()
>>> l
[1, 5, 123, 213, 467, 2341]

이 메소드는 리턴 값이 없습니다. 그러나 결과를 할당하려고하면 l.sort()어떻게됩니까?

>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = l.sort()
>>> print(r)
None

r이제 실제로는 아무것도 아닙니다. 이것은 파이썬이 부재 한 후 프로그래머가 잊어 버릴 수있는 이상하고 다소 성가신 세부 사항 중 하나입니다 (그래서 나는 이것을 쓰고 있으므로 다시 잊지 않습니다).

반면에이 함수 sorted()는의 내용에 대해 아무 것도 수행하지 l않지만 다음과 같은 내용으로 정렬 된 새 정렬 목록을 반환합니다 l.

>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = sorted(l)
>>> l
[1, 5, 2341, 467, 213, 123]
>>> r
[1, 5, 123, 213, 467, 2341]

반환 된 값입니다주의 하지 딥 카피 그래서 평소와 같이 목록에 포함 된 요소의 측면 effecty 작업에 대한주의 :

>>> spam = [8, 2, 4, 7]
>>> eggs = [3, 1, 4, 5]
>>> l = [spam, eggs]
>>> r = sorted(l)
>>> l
[[8, 2, 4, 7], [3, 1, 4, 5]]
>>> r
[[3, 1, 4, 5], [8, 2, 4, 7]]
>>> spam.sort()
>>> eggs.sort()
>>> l
[[2, 4, 7, 8], [1, 3, 4, 5]]
>>> r
[[1, 3, 4, 5], [2, 4, 7, 8]]


답변

목록을 반환하지 않는 이유를 이해하려면 다음을 수행하십시오.

sort () 메서드 는 값을 반환하지 않지만 sort () 메서드 는 특정 목록의 요소를 값을 반환하지 않고 오름차순 또는 내림차순 으로 정렬 합니다.

따라서 문제가 answer = newList.sort()없는 곳에 문제가 있습니다.

대신 당신은 할 수 있습니다 return newList.sort().

sort () 메소드의 구문은 다음과 같습니다.

list.sort(key=..., reverse=...)

또는 동일한 목적으로 Python의 내장 함수 sorted ()를 사용할 수도 있습니다.

sorted(list, key=..., reverse=...)

참고 : sort ()와 sorted ()의 가장 간단한 차이점은 다음과 같습니다. sort ()는 값을 반환하지 않지만 sorted ()는 반복 가능한 목록을 반환합니다.

따라서 귀하의 경우 answer = sorted(newList).


답변

정렬 목록을 반환하려면 sorted () 메서드를 사용할 수 있습니다. 더 편리합니다.

l1 = []
n = int(input())

for i in range(n):
  user = int(input())
  l1.append(user)
sorted(l1,reverse=True)

list.sort () 메서드는 목록을 현재 위치에서 수정하고 None을 반환합니다.

여전히 정렬을 사용하려면이 작업을 수행 할 수 있습니다.

l1 = []
n = int(input())

for i in range(n):
  user = int(input())
  l1.append(user)
l1.sort(reverse=True)
print(l1)