繁体   English   中英

Python是否会在内部跟踪某些内容的排序?

[英]Does Python keep track of when something has been sorted, internally?

例如,如果我打电话

L = [3,4,2,1,5]
L = sorted(L)

我得到一个排序列表。 现在,在将来,如果我想在L上执行其他类型的排序,Python是否会自动知道“此列表之前已经排序而未经过修改,因此我们可以对我们如何执行此类其他类型执行一些内部优化排序“如反向排序等?

不,它没有。 排序算法旨在利用(部分)排序的输入,但列表本身并不“记住”以任何方式排序。

(这实际上是一个CPython实现细节,未来的版本/不同的实现可以缓存列表刚刚排序的事实。但是,我不相信可以在不减慢修改列表的所有操作的情况下完成,例如append 。)

正如评论者指出的那样,普通的Python列表本身就是有序排序的,并且可以高效排序(感谢Timsort!),但不记得或维护排序状态。

如果您希望列表始终保留其排序状态,则可以从PyPI安装SortedContainers包。

>>> from sortedcontainers import SortedList
>>> L = SortedList([3,4,2,1,5])
>>> L
SortedList([1, 2, 3, 4, 5])
>>> L.add(3.3)
>>> L
SortedList([1, 2, 3, 3.3, 4, 5])

请注意,正常的append方法变为add ,因为该项目未添加到最后。 在给定排序顺序的情况下,它会在适当的位置添加。 还有一个SortedListWithKey类型,允许您显式设置排序键/顺序。

其中一些,至少是特定的反向排序问题,可以使用numpy完成:

import numpy as np
L = np.array([3,4,2,1,5])
a = np.argsort(L)
b = L[a]
r = L[a[::-1]]

print L
[3 4 2 1 5]

print b
[1 2 3 4 5]

print r
[5, 4, 3, 2, 1]

也就是说,这里我们只进行一次排序(创建a排序索引),然后我们可以操作a ,进行其他各种排序,如正常排序b和反向排序r 和其他许多元素一样,其他许多东西也同样容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM