例如,如果我打电话
L = [3,4,2,1,5]
L = sorted(L)
我得到一个排序列表。现在,在将来,如果我想在L上执行其他类型的排序,Python是否会自动知道“此列表之前已经排序而未经过修改,因此我们可以对我们如何执行此类其他类型执行一些内部优化排序“如反向排序等?
答案 0 :(得分:4)
不,它没有。排序算法旨在利用(部分)排序的输入,但列表本身并不记得"以任何方式排序。
(这实际上是一个CPython实现细节,未来的版本/不同的实现可以缓存列表刚刚排序的事实。但是,我不相信可以在不减慢所有修改的操作的情况下完成列表,例如append
。)
答案 1 :(得分:2)
正如评论者指出的那样,普通的Python列表本身就是有序排序的,并且可以高效排序(感谢Timsort!),但不记得或维护排序状态。
如果您希望列表始终保留其排序状态,则可以从SortedContainers安装PyPI包。
>>> 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
类型,允许您明确设置排序键/顺序。
答案 2 :(得分:1)
其中一些,至少是特定的反向排序问题,可以使用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
,做其他各种排序,比如正常排序{{ 1}}和反向排序b
。与其他元素一样,许多其他人也同样容易。