为什么Python的标准库中没有排序容器?

时间:2011-05-10 16:24:25

标签: python language-design sortedset sortedmap

是否有Python设计决策(PEP)阻止将已排序的容器添加到Python中?

OrderedDict不是已排序的容器,因为它是按插入顺序排序的。)

6 个答案:

答案 0 :(得分:64)

还有一个python sortedcontainers模块,它实现了排序列表,字典和集合类型。它与blist非常相似,但在 pure-Python 中实现,在大多数情况下faster实现。

>>> from sortedcontainers import SortedSet
>>> ss = SortedSet([3, 7, 2, 2])
>>> ss
SortedSet([2, 3, 7])

它还具有其他软件包不常见的功能:

>>> from sortedcontainers import SortedDict
>>> sd = SortedDict((num, num) for num in range(100000))
>>> sd.iloc[-5] # Lookup the fifth-to-last key.
99995

免责声明:我是sortedcontainers模块的作者。

答案 1 :(得分:61)

这是Guido的一个有意识的设计决定(他甚至对添加collections模块有点不情愿)。他的目标是在为应用程序选择数据类型时保留“一种明显的方法”。

基本概念是,如果用户足够复杂,意识到内置类型不是解决问题的正确方法,那么他们也可以找到合适的第三方库。

鉴于列表+排序,list + heapq和list + bisect涵盖了许多本来依赖于固有排序数据结构的用例,并且存在像blist这样的软件包,没有一个巨大的驱动力来增加更多的复杂性这个空间到标准库。

在某些方面,它类似于标准库中没有多维数组的事实,而是将该任务交给NumPy人员。

答案 2 :(得分:10)

还有blist模块包含sortedset数据类型:

sortedset(iterable=(), key=None)

>>> from blist import sortedset
>>> my_set = sortedset([3,7,2,2])
sortedset([2, 3, 7]

答案 3 :(得分:3)

不完全是“已排序的容器”,但您可能对标准库的bisect模块感兴趣,该模块“支持按排序顺序维护列表,而无需在每次插入后对列表进行排序”。< / p>

答案 4 :(得分:1)

标准库中有一个heapq,它没有完全排序,但有点类似。还有一个blist包,但它不在标准库中。

答案 5 :(得分:-1)

Python列表是有序的。如果你对它们进行排序,它们会保持这种状态在Python 2.7中,添加了OrderedDict类型来维护显式或减少的字典。

Python也有sets(成员必须是唯一的集合),但根据定义它们是无序的。对集合进行排序只会返回list