为什么“return list.sort()”返回None,而不是列表?

时间:2011-09-04 17:58:29

标签: python list sorting return

我已经验证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

7 个答案:

答案 0 :(得分:119)

list.sort对列表进行排序,即它不返回新列表。只需写下

newList.sort()
return newList

答案 1 :(得分:105)

问题在于:

answer = newList.sort()

sort不会返回排序列表;相反,它对列表进行了排序。

使用:

answer = sorted(newList)

答案 2 :(得分:53)

Here是来自Guido van Rossum的电子邮件,在python的开发列表中解释了为什么他选择不返回self影响对象的操作而不返回新对象。

  

这来自编码风格(在各种其他语言中流行,我     相信特别是Lisp狂热其中的一系列副作用     在单个对象上可以链接如下:

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

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

我发现链接形式对可读性构成威胁;它需要的       读者必须非常熟悉每种方法。该       第二种形式清楚地表明这些调用中的每一个都是相同的       对象,所以即使你不了解类及其方法       好吧,你可以理解第二次和第三次调用都适用于       x(并且所有调用都是针对它们的副作用而制作的),而不是       别的什么。

     

我想为返回新值的操作保留链接,       像字符串处理操作:

 y = x.rstrip("\n").split(":").lower()

答案 3 :(得分:13)

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相同:< / p>

>>> 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 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]]

答案 4 :(得分:12)

Python习惯性地从改变数据的函数和方法返回None,例如list.sortlist.appendrandom.shuffle,其想法是提示事实上,它正在变异。

如果你想获取一个iterable并返回一个新的,已排序的项目列表,请使用sorted内置函数。

答案 5 :(得分:3)

要了解为什么它不返回列表:

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)

答案 6 :(得分:0)

  

如果要返回排序列表,可以使用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)