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

时间:2014-10-30 14:25:22

标签: python list sorting

例如,如果我打电话

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

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

3 个答案:

答案 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。与其他元素一样,许多其他人也同样容易。