Python:collections.Counter 使用双端队列样式排序

Python: collections.Counter with deque-style ordering

我是一个相对较新的 Python (3) 程序员。我需要一种数据结构,它似乎结合了 collections.Counter、deque 和 set 的特性,希望有更多经验的人可以提出最 "pythonic" 的方法。

我有一个稀疏的整数索引集合,需要维护与每个索引关联的计数——就像一个计数器。但我也想保留 index:count 对之间的隐式排序,这样我就可以,例如在不知道其索引的情况下删除最旧的 - 就像一个双端队列。最后,我希望能够方便地检查是否存在索引,例如集合。最后,以防万一,我想使用 rv_discrete 从 scypy.stats 到 select 的成员,概率由计数加权。

非常感谢任何想法。

从您的描述来看,大多数情况应该是有序的计数器。 OrderedDict 跟踪插入顺序,Counter 跟踪项目的频率。

演示:

>>> from collections import OrderedDict, Counter
>>> class OrderedCounter(Counter, OrderedDict):
...     pass
>>>
>>> oc = OrderedCounter()
>>> oc[0] = 5
>>> oc[2] = 27
>>> oc
OrderedCounter({2: 27, 0: 5})
>>> oc.update({2:1, 0:6, 7:1})
>>> oc
OrderedCounter({2: 28, 0: 11, 7: 1})
>>> oc.popitem()
(7, 1)
>>> oc.popitem()
(2, 28)
>>> oc.popitem()
(0, 11)

您可以使用 oc.keys()[0] 获得第一个插入的密钥。