Lee*_*Str 126 python sorting return list
我已经能够验证findUniqueWords
确实导致排序list
.然而,它没有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
Run Code Online (Sandbox Code Playgroud)
Ism*_*awi 155
list.sort
对列表进行排序,即它不返回新列表.写吧
newList.sort()
return newList
Run Code Online (Sandbox Code Playgroud)
NPE*_*NPE 121
问题出在这里:
answer = newList.sort()
Run Code Online (Sandbox Code Playgroud)
sort
不返回排序列表; 相反,它将列表排序到位.
使用:
answer = sorted(newList)
Run Code Online (Sandbox Code Playgroud)
Gon*_*lde 57
这是来自Guido van Rossum的电子邮件,在python的开发列表中解释为什么他选择不返回self
影响对象的操作而不返回新的操作.
这来自于一种编码风格(在其他各种语言中很流行,我相信Lisp特别喜欢它),其中对单个对象的一系列副作用可以链接如下:
Run Code Online (Sandbox Code Playgroud)x.compress().chop(y).sort(z)
这将是相同的
Run Code Online (Sandbox Code Playgroud)x.compress() x.chop(y) x.sort(z)
我发现链接形式对可读性构成威胁; 它要求读者必须非常熟悉每种方法.第二种形式清楚地表明这些调用中的每一个都作用于同一个对象,因此即使您不熟悉该类及其方法,您也可以理解第二个和第三个调用应用于x(并且所有的电话都是为了他们的副作用而做的,而不是其他的.
我想为返回新值的操作保留链接,比如字符串处理操作:
Run Code Online (Sandbox Code Playgroud)y = x.rstrip("\n").split(":").lower()
zxq*_*xq9 13
Python有两种排序:排序方法(或"成员函数")和排序函数.sort方法对名为的对象的内容进行操作 - 将其视为对象重新排序的动作.sort函数是对对象表示的数据的操作,并按排序顺序返回具有相同内容的新对象.
给定一个名为整数l
的列表,如果我们调用,列表本身将被重新排序l.sort()
:
>>> l = [1, 5, 2341, 467, 213, 123]
>>> l.sort()
>>> l
[1, 5, 123, 213, 467, 2341]
Run Code Online (Sandbox Code Playgroud)
此方法没有返回值.但是,如果我们尝试分配结果l.sort()
呢?
>>> l = [1, 5, 2341, 467, 213, 123]
>>> r = l.sort()
>>> print(r)
None
Run Code Online (Sandbox Code Playgroud)
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]
Run Code Online (Sandbox Code Playgroud)
请注意,返回的值是不是一个深拷贝,所以要谨慎了包含列表照常中的元素侧effecty操作:
>>> 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]]
Run Code Online (Sandbox Code Playgroud)
Mik*_*ham 12
Python的习惯性地返回None
从功能和变异数据的方法,比如list.sort
,list.append
和random.shuffle
,与想法是,它暗示一个事实,即它是变异.
如果要获取iterable并返回其项的新排序列表,请使用sorted
builtin函数.
dou*_*lix 10
我在其他答案中没有看到的一个小智慧:
python 中可变对象(如列表)的所有修改列表的方法都会返回None
. 因此,对于列表,还包括 list.append()、list.reverse() 等。这就是为什么语法应该是
myList.sort()
同时,任何不可变对象(如字符串)的方法必须像这样分配:
myString = myString.strip()
要了解为什么它不返回列表:
sort() 不返回任何值,而 sort()方法只是按特定顺序对给定列表的元素进行排序 -升序或降序,而不返回任何值。
所以问题是answer = newList.sort()
没有答案。
相反,你可以这样做return newList.sort()
。
sort() 方法的语法是:
list.sort(key=..., reverse=...)
Run Code Online (Sandbox Code Playgroud)
或者,您也可以使用Python的内置函数sorted()来达到相同的目的。
sorted(list, key=..., reverse=...)
Run Code Online (Sandbox Code Playgroud)
注意:sort()和sorted()之间最简单的区别是:sort()不返回任何值,而sorted()返回一个可迭代列表。
所以在你的情况下answer = sorted(newList)
。
归档时间: |
|
查看次数: |
112504 次 |
最近记录: |