我有这样的嵌套字典:
data = {
"2010":{
'A':2,
'B':3,
'C':5,
'D':-18,
},
"2011":{
'A':1,
'B':2,
'C':3,
'D':1,
},
"2012":{
'A':1,
'B':2,
'C':4,
'D':2
}
}在我的例子中,从2010年到2012年,我每年都需要根据其相似的键对所有的值进行求和。所以我期望的结果应该是这样的:
data = {'A':4,'B':7, 'C':12, 'D':-15}发布于 2017-03-09 11:00:54
尝尝这个,
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}发布于 2017-03-09 10:58:16
您可以使用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仅针对具有正值的用例设计:
多集方法仅针对具有正值的用例设计。输入可以是负的,也可以是零的,但是只创建了具有正值的输出。没有类型限制,但值类型需要支持加法、减法和比较。
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})https://stackoverflow.com/questions/42693487
复制相似问题