为什么“return list.sort()”返回 None 而不是列表?[重复]
- 2024-12-02 08:42:00
- admin 原创
- 219
问题描述:
我已经能够验证 确实会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 开发列表中的 Guido van Rossum 的一封电子邮件,self
解释了为什么他选择不返回影响对象的操作并且不返回新对象。
这源自一种编码风格(在其他各种语言中都很流行,我相信 Lisp 尤其喜欢它),其中对单个对象的一系列副作用可以像这样链接起来:
x.compress().chop(y).sort(z)
这与
x.compress() x.chop(y) x.sort(z)
我发现链式调用形式对可读性有威胁;它要求读者必须非常熟悉每种方法。第二种形式清楚地表明,这些调用中的每一个都作用于同一个对象,因此,即使您不太了解该类及其方法,也可以理解第二次和第三次调用应用于 x(并且所有调用都是为了它们的副作用),而不是其他东西。
我想保留返回新值的操作的链接,比如字符串处理操作:
y = x.rstrip(" ").split(":").lower()
解决方案 4:
Python 有两种排序方式:排序方法(或“成员函数”)和排序函数。排序方法对指定对象的内容进行操作——可以将其视为对象对自身进行重新排序的操作。排序函数是对对象所表示的数据进行操作,并返回按排序顺序具有相同内容的新对象。
给定一个名为的整数列表,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:
我在其他答案中没有看到的一小点智慧:
Python 中所有修改列表的可变对象(如列表)的方法都会返回None
。因此,对于列表,这还包括 list.append()、list.reverse() 等。这就是为什么语法应该是
myList.sort()
同时,任何不可变对象(如字符串)的方法都必须像这样分配:
myString = myString.strip()
解决方案 7:
要了解为什么它不返回列表:
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)
。
解决方案 8:
如果希望返回排序后的列表,可以使用 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)
扫码咨询,免费领取项目管理大礼包!