[英]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.