在defaultdict中计算项目

use*_*084 1 python dictionary python-2.7

我有一个defaultdict,然后转换成字典.现在我正在寻找一种方法来计算按值分组的项目.我的意思是:

dict = {1: [103], 2: [9], 3: [3, 4], 4: [103, 106], 10: [3, 4], 11: [1, 9], 28: [1]}

for key in dict.items():
    print key
Run Code Online (Sandbox Code Playgroud)
(1, [103])
(2, [9])
(3, [3, 4])
(4, [103, 106])
(10, [3, 4])
(11, [1, 9])
(28, [1])

item : total
{4 : 2, 106 : 1} ...
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

the*_*eye 7

您可以使用collections.Counter来计算值列表中每个元素的出现次数,如下所示

>>> from collections import Counter
>>> Counter(value for values in d.itervalues() for value in values)
Counter({1: 2, 3: 2, 4: 2, 103: 2, 9: 2, 106: 1})
Run Code Online (Sandbox Code Playgroud)

Counter是字典的子类.所以,你可以像任何其他字典一样使用它


itertools.chain.from_iterable像这样,可以完成值的扁平化

>>> from collections import Counter
>>> from itertools import chain
>>> Counter(chain.from_iterable(d.itervalues()))
Counter({1: 2, 3: 2, 4: 2, 103: 2, 9: 2, 106: 1})
Run Code Online (Sandbox Code Playgroud)