Почему «return list.sort ()» возвращает None, а не список? - PullRequest
111 голосов
/ 04 сентября 2011

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

Ответы [ 6 ]

130 голосов
/ 04 сентября 2011

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

newList.sort()
return newList
112 голосов
/ 04 сентября 2011

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

answer = newList.sort()

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

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

answer = sorted(newList)
54 голосов
/ 03 октября 2012

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

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

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

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

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

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

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

 y = x.rstrip("\n").split(":").lower()
13 голосов
/ 10 ноября 2015

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 (именно поэтому я пишу это, поэтому I не забывайте снова).

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

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

>>> 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]]
12 голосов
/ 04 сентября 2011

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

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

3 голосов
/ 06 декабря 2018

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

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)

...