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

114 投票
7 回答
67382 浏览
提问于 2025-04-16 17:22

有没有什么Python的设计决定(PEP)让我们不能在Python中添加一个排序的容器?

(OrderedDict 不是一个排序的容器,因为它是按照插入的顺序来排列的。)

7 个回答

12

还有一个叫做 blist 的模块,它里面有一种数据类型叫做 sortedset

sortedset(iterable=(), key=None)

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

还有一个叫做 sortedcontainers 的Python模块,它可以实现排序的列表、字典和集合。这和blist很像,但它是用纯Python写的,而且在大多数情况下运行速度更

>>> 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模块的作者。

96

这是Guido有意做出的设计选择(他对添加collections模块其实还有点犹豫)。他的目标是保持“只有一种明显的方法来做这件事”,特别是在选择应用程序的数据类型时。

基本的想法是,如果用户足够聪明,能意识到内置的数据类型不适合他们的问题,那么他们也能找到合适的第三方库来解决问题。

因为像列表加排序、列表加堆(heapq)和列表加二分查找(bisect)这些组合,已经能满足很多需要排序数据结构的情况,而且还有像blist这样的包存在,所以在标准库中增加更多复杂的东西并没有太大的必要。

在某种程度上,这就像标准库里没有多维数组一样,而是把这个任务留给了NumPy团队去做。

撰写回答