是否有Python设计决策(PEP)阻止将已排序的容器添加到Python?
(OrderedDict
不是已排序的容器,因为它是按插入顺序排序的。)
Answers:
对于Guido而言,这是一个有意识的设计决定(他甚至不愿意增加collections
模块)。他的目标是在选择应用程序的数据类型时保留“一种显而易见的方式”。
基本概念是,如果用户足够复杂,以至于不能意识到内置类型不是解决其问题的正确解决方案,那么他们还可以找到合适的第三方库。
鉴于list + sorting,list + heapq和list + bisect涵盖了许多本来会依赖于固有排序的数据结构的用例,并且存在像blist这样的包,因此没有很大的动力来增加该空间的复杂性,标准库。
在某些方面,这类似于标准库中没有多维数组的事实,而是将该任务割让给了NumPy员工。
collections.Counter
可以用作排序集。虽然可能没有效率。
collections.Counter
未排序,不适合表示已排序的集合。
dict
是一个哈希表。
还有一个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模块的作者。
Python列表是有序的。如果对它们进行排序,它们会保持这种状态。在Python 2.7中OrderedDict
,添加了一种类型来维护显式排序的字典。
Python还具有集合(成员必须是唯一的集合),但根据定义,它们是无序的。对集合进行排序只会返回list
。