我已经能够验证 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
theSet= set(theList)
大功告成,您只需将其投射回列表:theList = list(theSet)
大功告成。简单的。
theSet' into a sorted list with
sorted(theSet)`。
list.sort
对列表进行就地排序,即它不返回新列表。写吧
newList.sort()
return newList
问题在这里:
answer = newList.sort()
sort
不返回排序列表;相反,它会对列表进行适当的排序。
利用:
answer = sorted(newList)
list.sort()
和 sorted(list)
之间的区别。
Here is an email 来自 Python 开发列表中的 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()
split(":").lower()
是一个坏链,因为 split
返回一个没有 lower
方法的列表。
Python 有两种排序:排序方法(或“成员函数”)和排序函数。 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
现在实际上等于什么。这是程序员在离开 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]
请注意,返回的值不是 deep copy,因此请像往常一样小心对列表中包含的元素的副作用操作:
>>> 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]]
lst.sort()
与 sorted(lst)
之间的区别很有帮助
Python 习惯性地从改变数据的函数和方法(例如 list.sort
、list.append
和 random.shuffle
)返回 None
,其想法是它暗示它正在改变的事实。
如果您想获取一个可迭代对象并返回其项目的新排序列表,请使用 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)
。
我在其他答案中没有看到的一小部分智慧:
python 中所有修改列表的可变对象(如列表)的方法都返回 None
。因此,对于列表,这还包括 list.append()、list.reverse() 等。这就是为什么语法应该是
myList.sort()
同时,任何不可变对象(如字符串)的方法必须像这样分配:
myString = myString.strip()
如果您希望它返回排序列表,您可以使用 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)
不定期副业成功案例分享
return sorted(newList)
更短。在这里无关紧要,因为变量是本地的,但在某些情况下,就地排序可能会更改共享变量。a.append('x')
还是a.extend('x)
,您都不能在末尾链接sort()
。它必须分成2行。如果方法返回列表会更好! docs.python.org/3/tutorial/datastructures.html 同样的信息也让我很不爽。因此,您必须将内容分成两行,之后您必须在列表中使用.sort()
NOTsorted()
,因为这会产生相同的错误l = ['1']; l = sorted(l.append('2'))
(我只是添加了分号所以你可以剪切/粘贴并运行)sort
函数是这样设计的?如果返回排序列表而不是无,是否有任何性能开销或其他缺点?print(newList.sort())
给了None
。但是,当我这样做时,newList.sort()
然后print(newList)
它起作用了。b = a.sort()
,那么b.pop()
,对a
有什么影响?在某些语言中,.sort
返回已排序的a
的副本,在其他语言中,它就地排序并返回对a
的引用。 Python 通过就地突变返回None
来消除歧义,而不是它们被调用的东西的别名,因此减少了混乱。如果需要副本,则使用sorted
(它适用于所有可迭代对象,而不仅仅是list
,始终按排序顺序返回list
)。alist.sort()
返回alist
的性能开销大致为零,只是不确定性。