【问题标题】:Why does "return list.sort()" return None, not the list? [duplicate]为什么 \"return list.sort()\" 返回 None,而不是列表? [复制]
【发布时间】:2023-01-30 03:43:04
【问题描述】:

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

【问题讨论】:

  • 我认为您不需要多次将 item 转换为字符串。通常一次就足够了,而且在 cleanUp 的输入上执行它也更干净。
  • 只是一个愚蠢的想法,但如果你想要一个独特项目的列表,你为什么不转换成一个集合呢?然后,您可以根据需要将它们转换回列表。 theSet= set(theList) 大功告成,只需要将其转换回列表即可:theList = list(theSet) 大功告成。简单的。
  • 添加@runlevel0 所说的(这是一个好主意):您可以转换theSet' into a sorted list with sorted(theSet)`。
  • 非常不规则的语言
  • 仅仅因为链接在一种语言中是一种常见的 API 习语并不意味着它必须在所有语言中都存在,并且它与函数式编程关系不大(函数式编程鼓励使用不可变值,这使得变异方法返回的问题对对象的引用)。

标签: python list sorting return


【解决方案1】:

list.sort 对列表进行就地排序,即它不返回新列表。写吧

newList.sort()
return newList

【讨论】:

  • return sorted(newList) 更短。此处无关紧要,因为变量是本地变量,但就地排序在某些情况下可能会更改共享变量。
  • 有趣的是,如果将一个条目添加到列表中,无论是a.append('x') 还是a.extend('x),您都不能在末尾链接sort()。它必须分成两行。如果方法返回列表会更好! docs.python.org/3/tutorial/datastructures.html 这样做同样的消息让我很生气。因此你必须把它分成两行,你必须使用.sort()不是sorted() 之后在列表中,因为这会产生相同的错误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 的性能开销大致为零,只是不确定性。
【解决方案2】:

问题在这里:

answer = newList.sort()

sort不返回排序后的列表;相反,它将列表排序到位。

利用:

answer = sorted(newList)

【讨论】:

  • 这是大多数人需要的:list.sort()sorted(list) 之间的区别。
  • 有关详细信息,请参阅此文档 - realpython.com/python-sort
【解决方案3】:

来自 Python 开发列表中的 Guido van Rossum 的 Here is an email 解释了为什么他选择不返回 self 影响对象的操作并且不返回新的。

这来自一种编码风格(在其他各种语言中很流行,我 相信尤其是 Lisp 陶醉其中)其中一系列的副作用 在单个对象上可以像这样链接:

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

这将与

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

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

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

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

【讨论】:

  • 有趣的是,split(":").lower() 是一个糟糕的链,因为 split 返回一个没有 lower 方法的列表。
【解决方案4】:

Python 有两种类型:一种方法(或“成员函数”)和排序功能. 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) 之间的区别很有帮助
【解决方案5】:

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

如果你想获取一个可迭代对象并返回一个新的、排序的项目列表,请使用 sorted 内置函数。

【讨论】:

    【解决方案6】:

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

    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)

    【讨论】:

    • > 相反,您可以只做 return newList.sort() ……这是一种误导。它将返回 None 而不是排序列表。所以是的,你可以做到,但可能不会按照预期去做。
    【解决方案7】:

    我在其他答案中没有看到的一小部分智慧:

    python 中所有修改列表的可变对象(如列表)的方法都返回None。因此,对于列表,这还包括 list.append()、list.reverse() 等。这就是为什么语法应该是

    myList.sort()

    同时,任何不可变对象(如字符串)的方法必须像这样分配:

    myString = myString.strip()

    【讨论】:

    • 正是我的问题。如果您使用的是 lambda,请改用 sorted
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 1970-01-01
      • 2019-11-23
      • 2013-08-14
      • 2019-05-08
      相关资源
      最近更新 更多