如何从键/初始计数对列表中初始化计数器?

ale*_*xis 5 python counter data-structures python-3.x python-internals

如果我有一(key, value)对配对,我可以快速初始化这样的字典:

>>> data = [ ('a', 1), ('b', 2) ]
>>> dict(data) 
{'a': 1, 'b': 2} 
Run Code Online (Sandbox Code Playgroud)

我想用Counter字典做同样的事; 但怎么样?构造函数和update()方法都将有序对视为键,而不是键值对:

>>> from collections import Counter
>>> Counter(data)
Counter({('a', 1): 1, ('b', 2): 1})
Run Code Online (Sandbox Code Playgroud)

我能管理的最好的就是使用一个临时字典,这个字典很丑陋而且不必要地迂回:

>>> Counter(dict(data))
Counter({'b': 2, 'a': 1})
Run Code Online (Sandbox Code Playgroud)

有没有一种正确的方法Counter从一(key, count)对配对中直接初始化?我的用例涉及从文件中读取大量已保存的计数(使用唯一键).

Ray*_*ger 11

我会做一个循环:

for obj, cnt in [ ('a', 1), ('b', 2) ]:
    counter[obj] = cnt
Run Code Online (Sandbox Code Playgroud)

您也可以只调用父dict.update方法:

>>> from collections import Counter
>>> data = [ ('a', 1), ('b', 2) ]
>>> c = Counter()
>>> dict.update(c, data)
>>> c
Counter({'b': 2, 'a': 1})
Run Code Online (Sandbox Code Playgroud)

最后,您的原始解决方案没有任何问题:

Counter(dict(list_of_pairs))
Run Code Online (Sandbox Code Playgroud)

创建字典或计数器的昂贵部分是对所有键进行散列并定期调整大小.一旦制作了字典,将其转换为计数器就像dict.copy()一样快便宜.重用哈希值,并且最终的计数器哈希表是预先调整大小的(不需要调整大小).