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).您也不需要嵌套列表推导,单个生成器表达式也可以.
这个
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创建一个新列表,对其进行排序并返回它.
| 归档时间: |
|
| 查看次数: |
10736 次 |
| 最近记录: |