Почему "return list.sort()" возвращает None, а не список?

Мне удалось проверить, что findUniqueWords приводит к сортировке 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

Ответ 1

list.sort сортирует список на месте, т.е. он не возвращает новый список. Просто напишите

newList.sort()
return newList

Ответ 2

Проблема здесь:

answer = newList.sort()

sort не возвращает отсортированный список; скорее, он сортирует список на месте.

Использование:

answer = sorted(newList)

Ответ 3

Вот электронное письмо от Гвидо ван Россума из списка разработчиков Python, объясняющее, почему он решил не возвращать self при операциях, которые влияют на объект, и не возвращать новый.

Это происходит от стиля кодирования (популярного в различных других языках, я   верю особенно Lisp упивается этим) где ряд побочных эффектов   на один объект можно зацепить так:

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

который будет таким же, как

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

Я считаю, что форма цепочки угрожает читабельности; это требует, чтобы     Читатель должен быть близко знаком с каждым из методов.     вторая форма дает понять, что каждый из этих вызовов действует на     объект, и поэтому, даже если вы не знаете, класс и его методы очень     ну, вы можете понять, что второй и третий вызов применяются к     х (и что все звонки сделаны из-за их побочных эффектов), а не     что-то еще.

Я хотел бы зарезервировать цепочку для операций, которые возвращают новые значения,     как операции обработки строки:

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

Ответ 4

Python имеет два вида сортировки: метод сортировки (или "функция-член" ) и функцию сортировки. Метод 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 теперь фактически ничего не значит. Это одна из тех странных, несколько досадных деталей, которые программист, вероятно, забудет после периода отсутствия на Python (вот почему я пишу это, поэтому я не забываю снова).

Функция 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]

Помните, что возвращаемое значение не является глубокой копией, поэтому будьте осторожны с побочными эффектами над элементами, содержащимися в списке, как обычно

>>> 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]]

Ответ 5

Обычно Python возвращает None из функций и методов, которые мутируют данные, такие как list.sort, list.append и random.shuffle, при том, что он намекает на то, что он мутировал.

Если вы хотите выполнить итерацию и вернуть новый, отсортированный список своих элементов, используйте встроенную функцию sorted.

Ответ 6

Чтобы понять, почему он не возвращает список:

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

Ответ 7

  Вы можете использовать метод 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)

Ответ 8

Пожалуйста, перечитайте документацию для функции Python sort, концентрируясь на ее возвращаемом значении.