为什么'.sort()'导致Python中的列表为'None'?

Btu*_*man 8 python sorting list

我试图对ints 的Python列表进行排序,然后使用该.pop()函数返回最高的一个.我尝试过以不同的方式编写方法:

def LongestPath(T):    
    paths = [Ancestors(T,x) for x in OrdLeaves(T)]
    #^ Creating a lists of lists of ints, this part works
    result =[len(y) for y in paths ]
    #^ Creating a list of ints where each int is a length of the a list in paths
    result = result.sort()
    #^meant to sort the result
    return result.pop()
    #^meant to return the largest int in the list (the last one)
Run Code Online (Sandbox Code Playgroud)

我也试过了

def LongestPath(T):
    return[len(y) for y in [Ancestors(T,x) for x in OrdLeaves(T)] ].sort().pop()
Run Code Online (Sandbox Code Playgroud)

在这两种情况下.sort()都会导致列表None(没有.pop()函数并返回错误).当我删除.sort() 它工作正常,但没有返回最大,int因为列表没有排序.

agf*_*agf 20

只需删除分配

result = result.sort()
Run Code Online (Sandbox Code Playgroud)

离开了

result.sort()
Run Code Online (Sandbox Code Playgroud)

sort方法就地工作(它修改现有列表),因此不需要分配,并返回None.将结果分配给列表名称时,您将分配None.

它可以轻松(并且更有效)写成一个单行:

max(len(Ancestors(T,x)) for x in OrdLeaves(T))
Run Code Online (Sandbox Code Playgroud)

max以线性时间O(n)运行,而排序为O(nlogn).您也不需要嵌套列表推导,单个生成器表达式也可以.

  • @Btuman要清楚,`.sort()`不会"导致列表为'None`",它只返回`None`.但是,当您将`None`分配给名称`result`时,您将无法访问已排序的列表 - `result`不再指向它.同样的事情发生在一个班轮中 - 当你执行`.sort()`时,你将无法访问列表,因为你只能访问内部表达式的结果,以及`.sort的结果( )```None`不是它修改的列表. (2认同)

Ste*_*ski 9

这个

result = result.sort()
Run Code Online (Sandbox Code Playgroud)

应该是这个

result.sort()
Run Code Online (Sandbox Code Playgroud)

Python中的一种约定是改变序列的方法返回None.

考虑:

>>> a_list = [3, 2, 1]
>>> print a_list.sort()
None
>>> a_list
[1, 2, 3]

>>> a_dict = {}
>>> print a_dict.__setitem__('a', 1)
None
>>> a_dict
{'a': 1}

>>> a_set = set()
>>> print a_set.add(1)
None
>>> a_set
set([1])
Run Code Online (Sandbox Code Playgroud)

Python的设计和历史常见问题解答给出了这个设计决策背后的原因(关于列表):

为什么不list.sort(返回排序列表?

在性能很重要的情况下,制作列表的副本只是为了对它进行排序将是浪费.因此,list.sort()将列表排序到位.为了提醒您这一事实,它不会返回排序列表.这样,当您需要排序副本时,您不会被意外地覆盖列表,但也需要保留未排序的版本.

在Python 2.4中添加了一个新的内置函数 - sorted().此函数从提供的iterable创建一个新列表,对其进行排序并返回它.


Omr*_*rel 5

.sort()返回 None 并就地对列表进行排序。