Ответ 1
list.sort
сортирует список на месте, т.е. он не возвращает новый список. Просто напишите
newList.sort()
return newList
Мне удалось проверить, что 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
list.sort
сортирует список на месте, т.е. он не возвращает новый список. Просто напишите
newList.sort()
return newList
Проблема здесь:
answer = newList.sort()
sort
не возвращает отсортированный список; скорее, он сортирует список на месте.
Использование:
answer = sorted(newList)
Вот электронное письмо от Гвидо ван Россума из списка разработчиков Python, объясняющее, почему он решил не возвращать self
при операциях, которые влияют на объект, и не возвращать новый.
Это происходит от стиля кодирования (популярного в различных других языках, я верю особенно Lisp упивается этим) где ряд побочных эффектов на один объект можно зацепить так:
x.compress().chop(y).sort(z)
который будет таким же, как
x.compress() x.chop(y) x.sort(z)
Я считаю, что форма цепочки угрожает читабельности; это требует, чтобы Читатель должен быть близко знаком с каждым из методов. вторая форма дает понять, что каждый из этих вызовов действует на объект, и поэтому, даже если вы не знаете, класс и его методы очень ну, вы можете понять, что второй и третий вызов применяются к х (и что все звонки сделаны из-за их побочных эффектов), а не что-то еще.
Я хотел бы зарезервировать цепочку для операций, которые возвращают новые значения, как операции обработки строки:
y = x.rstrip("\n").split(":").lower()
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]]
Обычно Python возвращает None
из функций и методов, которые мутируют данные, такие как list.sort
, list.append
и random.shuffle
, при том, что он намекает на то, что он мутировал.
Если вы хотите выполнить итерацию и вернуть новый, отсортированный список своих элементов, используйте встроенную функцию sorted
.
Чтобы понять, почему он не возвращает список:
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)
Пожалуйста, перечитайте документацию для функции Python sort
, концентрируясь на ее возвращаемом значении.