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


154

我已经能够验证findUniqueWords结果是否为sorted 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

我认为您不需要将项目变成字符串那么多次。通常一次就足够了,并且也可以在cleanUp的输入上进行清理。

3
只是一个愚蠢的想法,但是如果您想要一系列独特的商品,为什么不将其转换为一套呢?然后,您可以根据需要将它们转换回列表。 theSet= set(theList) 至此,您只需要将其投射回列表即可: theList = list(theSet) 完成。简单。
runlevel0

1
添加到@ runlevel0说的(这是一个好主意):您可以转换一个theSet' into a sorted list with sorted(theSet)`。
Zaz

语言非常不规范
nicolas

这是语言的核心(但有问题/烦人的)哲学选择。一般而言,链接是python中的一个孤立概念。
javadba

Answers:


194

list.sort对列表进行适当排序,即不返回新列表。写就好了

newList.sort()
return newList

18
return sorted(newList)更短。此处无关紧要,因为变量是局部变量,但是就地排序可能会在某些情况下更改共享变量。
让·弗朗索瓦·法布尔

有趣的是,如果将一个条目添加到列表中a.append('x'),或者a.extend('x)您也不能sort()在末尾链接。它必须分为2行。如果方法返回列表,那就更好了! docs.python.org/3/tutorial/datastructures.html 这样做,这条消息也让我很吃惊。因此,您必须将其分成两行,之后必须在列表中使用.sort() NOT sorted(),因为这会产生相同的错误 l = ['1']; l = sorted(l.append('2'))(我刚刚添加了分号,以便您可以剪切/粘贴并运行)
JGFMK,

我也想补充它可能是值得看看这个:grantjenks.com/docs/sortedcontainersgithub.com/grantjenks/python-sortedcontainers在我,已经在考虑从列表重构来一套一套的,因为我没有想要重复,然后正在寻找SortedSet实现,并且在collections模块中找不到一个...来源:stackoverflow.com/questions/5953205/…–
JGFMK

3
为什么sort功能设计的这种方式?如果返回排序后的列表而不是无,是否有任何性能开销或其他缺点?
雷杨

1
我还面临着以下问题:print(newList.sort())None。然而,当我做到了,newList.sort()然后print(newList)它的工作。
科茨

135

问题在这里:

answer = newList.sort()

sort不返回排序列表;而是将列表排序到位。

用:

answer = sorted(newList)

4
这是最需要的:list.sort()和之间的区别sorted(list)
geekoverdose

62

这是 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()

33
可笑的是,它split(":").lower()是一条坏链,因为它split返回的列表没有lower方法。
SuperBiasedMan 2015年

14

蟒习惯性地返回None从功能和变异的数据的方法,例如list.sortlist.appendrandom.shuffle,与想法是,它暗示一个事实,即它是变异。

如果要进行迭代并返回其项目的新排序列表,请使用sorted内置函数。


14

Python有两种排序方式:sort 方法(或“成员函数”)和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]

请注意,返回的值是不是一个深拷贝,所以要谨慎了包含列表照常中的元素侧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]]

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)


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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.