93

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

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

4

6 回答 6

92

还有一个 python sortedcontainers模块,它实现了排序列表、字典和集合类型。它与 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 模块的作者。

于 2014-03-21T19:04:15.520 回答
88

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

基本概念是,如果用户足够成熟,能够意识到内置类型不是解决他们问题的正确解决方案,那么他们也有责任找到合适的第三方库。

鉴于 list+sorting、list+heapq 和 list+bisect 涵盖了许多原本依赖于固有排序数据结构的用例,并且存在诸如 blist 之类的包,因此没有很大的动力在这个领域增加更多的复杂性标准库。

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

于 2011-05-11T03:39:17.600 回答
12

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

sortedset(iterable=(), key=None)

>>> from blist import sortedset
>>> my_set = sortedset([3,7,2,2])
sortedset([2, 3, 7]
于 2012-05-30T10:10:48.627 回答
6

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

于 2012-05-30T13:48:27.997 回答
3

标准库中有一个heapq,它不是完全排序的,而是一种。还有一个blist包,但不在标准库中。

于 2011-05-10T16:47:58.363 回答
-5

Python 列表是有序的。如果你对它们进行排序,它们就会保持这种状态。在 Python 2.7OrderedDict中,添加了一个类型来维护一个明确排序的字典。

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

于 2011-05-10T16:56:37.500 回答