Python是否记录内部何时进行了排序?
问题描述:
例如,如果我叫Python是否记录内部何时进行了排序?
L = [3,4,2,1,5]
L = sorted(L)
我得到一个排序列表。现在,将来如果我想对L执行其他类型的排序,Python是否会自动知道“这个列表已经被排序过了,之后没有被修改过,所以我们可以对我们如何执行另一种类型的排序“,如反向排序等?
答
不,它不。排序算法旨在利用(部分)排序的输入,但列表本身并不“记住”以任何方式排序。 (这实际上是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!),但不记得或保持排序状态。
如果您想要总是保持其排序状态的列表,则可以安装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
类型,允许您明确设置排序键/顺序。
不是这样,但“Timsort”(CPython中的默认排序)查找有序的子序列 - 请参阅http://en.wikipedia.org/wiki/Timsort – jonrsharpe 2014-10-30 14:26:35
当然不能用'sorted',因为它重新定义了列表。但无论如何,我怀疑Python会跟踪对象上的操作。您可以尝试制作自定义类型。 – 2014-10-30 14:27:21
你可以在这里找到timsort的一些信息:https://hg.python.org/cpython/file/default/Objects/listsort.txt – 2014-10-30 14:37:56