为什么Python标准库中没有排序容器?
有没有什么Python的设计决定(PEP)让我们不能在Python中添加一个排序的容器?
(OrderedDict
不是一个排序的容器,因为它是按照插入的顺序来排列的。)
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团队去做。