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


155

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

항목을 문자열로 여러 번 바꿔야한다고 생각하지 않습니다. 한 번이면 충분하고 입력을 정리하여 정리하는 것이 더 깨끗합니다.
Ben

3
어리석은 생각이지만 독특한 아이템 목록을 원한다면 왜 세트로 변환하지 않습니까? 그런 다음 필요할 경우 다시 목록으로 변환 할 수 있습니다. 완료되었으므로 theSet= set(theList) 목록으로 다시 캐스팅하기 theList = list(theSet)만하면됩니다. 완료. 쉬운.
runlevel0

1
@ runlevel0의 말에 덧붙여 (좋은 생각입니다) : theSet' into a sorted list with sorted (theSet)`를 변환 할 수 있습니다 .
Zaz

매우 불규칙한 언어
nicolas

이것은 언어의 철학적 선택 이지만 문제가 있거나 자극적 입니다. 체인은 일반적으로 파이썬에서 고아 개념입니다.
javadba

답변:


195

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

newList.sort()
return newList

18
return sorted(newList)더 짧습니다. 변수가 로컬이기 때문에 여기에서 중요하지 않지만, 내부 정렬은 경우에 따라 공유 변수를 변경할 수 있습니다.
장 프랑수아 파브르

항목이 목록에 추가 a.append('x')되거나 끝에 a.extend('x)체인 sort()을 연결할 수 없다는 것이 흥미 롭습니다 . 2 줄로 분할해야합니다. 메소드가 목록을 리턴하면 더 좋았을 것입니다! docs.python.org/3/tutorial/datastructures.html 이 같은 메시지가 그렇게함으로써 저를 깨 물었습니다 . 결과적으로 두 줄로 나누어야합니다. 나중에 목록에 .sort() NOT 을 사용해야 sorted()합니다. 동일한 오류가 발생하기 때문에 l = ['1']; l = sorted(l.append('2'))(반 콜론을 추가하여 잘라내어 붙여 넣을 수 있습니다)
JGFMK

나는 또한 이것의 가치 보면있을 수 있습니다 추가 할 것 : grantjenks.com/docs/sortedcontainers가 , github.com/grantjenks/python-sortedcontainers 내가하지 않았다 때문에 내에서가, 이미 세트에 목록에서 리팩토링의 생각 중복을 원하고 SortedSet 구현을 찾고 컬렉션 모듈에서 찾지 못했습니다 ... 출처 : stackoverflow.com/questions/5953205/…
JGFMK

3
sort기능이 이런 식으로 설계된 이유무엇 입니까? 정렬 된 목록을 None 대신 반환하면 성능 오버 헤드 또는 기타 단점이 있습니까?
레이 양

1
나는 또한 folowing 문제에 직면 print(newList.sort())했다 None. 내가했다, 그러나 때 newList.sort()다음 print(newList)일했다.
Kots

136

문제는 여기 있습니다 :

answer = newList.sort()

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

사용하다:

answer = sorted(newList)

5
차이 : 이것은 가장 필요한 것입니다 list.sort()sorted(list).
geekoverdose

62

다음은 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()

33
재미있는 방법 은 메서드 가없는 목록을 반환 split(":").lower()하기 때문에 잘못된 체인 입니다. splitlower
SuperBiasedMan

14

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

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


14

파이썬에는 두 가지 종류의 정렬이 있습니다 : 정렬 메소드 (또는 "멤버 함수")와 정렬 함수 . 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]]

4

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

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).


0

정렬 목록을 반환하려면 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.