【问题标题】:Why does "return list.sort()" return None, not the list?为什么“return list.sort()”返回None,而不是列表?
【发布时间】:2011-11-10 04:41:09
【问题描述】:

我已经能够验证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()。它必须分成2行。如果方法返回列表会更好! docs.python.org/3/tutorial/datastructures.html 这样做也让我很不爽。因此,您必须将事情分成两行,之后您必须在列表中使用.sort() NOT sorted(),因为这会产生相同的错误l = ['1']; l = sorted(l.append('2'))(我只是添加了分号所以你可以剪切/粘贴并运行)
  • 我还要补充一点,这可能值得一看:grantjenks.com/docs/sortedcontainersgithub.com/grantjenks/python-sortedcontainers 在我看来,已经考虑从列表重构为集合,因为我不想重复,然后正在寻找一个 SortedSet 实现,并没有在集合模块中找到一个... 来源:stackoverflow.com/questions/5953205/…
  • 为什么sort函数是这样设计的?如果返回排序列表而不是 None,是否有任何性能开销或其他缺点?
  • 我也遇到了以下问题:print(newList.sort()) 给了None。但是,当我这样做时,newList.sort() 然后print(newList) 它起作用了。
【解决方案2】:

问题出在这里:

answer = newList.sort()

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

用途:

answer = sorted(newList)

【讨论】:

  • 这是最需要的:list.sort()sorted(list) 之间的区别。
  • 请参阅此文档以获取更多详细信息 - realpython.com/python-sort
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    来自 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("\n").split(":").lower()
    

    【讨论】:

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

    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) 之间的区别很有帮助
    【解决方案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】:

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

    【讨论】:

      【解决方案8】:

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

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

      myList.sort()

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

      myString = myString.strip()

      【讨论】:

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