Python是否记录内部何时进行了排序?

问题描述:

例如,如果我叫Python是否记录内部何时进行了排序?

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

我得到一个排序列表。现在,将来如果我想对L执行其他类型的排序,Python是否会自动知道“这个列表已经被排序过了,之后没有被修改过,所以我们可以对我们如何执行另一种类型的排序“,如反向排序等?

+7

不是这样,但“Timsort”(CPython中的默认排序)查找有序的子序列 - 请参阅http://en.wikipedia.org/wiki/Timsort – jonrsharpe 2014-10-30 14:26:35

+0

当然不能用'sorted',因为它重新定义了列表。但无论如何,我怀疑Python会跟踪对象上的操作。您可以尝试制作自定义类型。 – 2014-10-30 14:27:21

+0

你可以在这里找到timsort的一些信息:https://hg.python.org/cpython/file/default/Objects/listsort.txt – 2014-10-30 14:37:56

不,它不。排序算法旨在利用(部分)排序的输入,但列表本身并不“记住”以任何方式排序。 (这实际上是CPython的实现细节,未来的版本/不同的实现可以缓存列表刚刚排序的事实,但是我不相信如果不放慢所有修改列表的操作,如append。)

一些这方面,至少特别的逆向排序问题,可以使用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。和其他许多元素一样,其他许多人也会很容易。

正如评论者所指出的那样,正常的Python列表本质上是有序排序的(谢谢Timsort!),但不记得或保持排序状态。

如果您想要总是保持其排序状态的列表,则可以安装PyPISortedContainers程序包。

>>> 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类型,允许您明确设置排序键/顺序。