python中两个嵌套字典内的类似键的值和

时间:2017-03-09 10:56:16

标签: python dictionary

我有这样的嵌套字典:

data = {'A':4,'B':7, 'C':12, 'D':-15}

在我的情况下,我需要在2010年至2012年期间每年根据类似的密钥对所有值进行求和。 所以我预期的结果应该是这样的:

StringBuilder

2 个答案:

答案 0 :(得分:4)

您可以使用collections.Counter()(仅适用于正值!):

In [17]: from collections import Counter
In [18]: sum((Counter(d) for d in data.values()), Counter())
Out[18]: Counter({'C': 12, 'B': 7, 'A': 4, 'D': 3})

请注意,基于python文档Counter仅适用于具有正值的用例:

  

multiset方法仅适用于具有正值的用例。输入可以是负数或零,但仅创建具有正值的输出。没有类型限制,但值类型需要支持加法,减法和比较。   elements()方法需要整数计数。它忽略了零和负数。

因此,如果您想获得全面的结果,您可以手动进行求和。 collections.defaultdict()是解决此问题的好方法:

In [28]: from collections import defaultdict

In [29]: d = defaultdict(int)

In [30]: for sub in data.values():
   ....:     for i, j in sub.items():
   ....:         d[i] += j
   ....:         

In [31]: d
Out[31]: defaultdict(<class 'int'>, {'D': -15, 'A': 4, 'C': 12, 'B': 7})

答案 1 :(得分:1)

试试这个,

reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.iteritems()), data.values())

<强>结果

{'A': 4, 'B': 7, 'C': 12, 'D': -15}