2017-03-09 50 views
6

我有嵌套的字典是这样的:和值内的两个嵌套的字典在Python

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} 

回答

1

试试这个,

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

结果的'D'是'-15`右

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

赞成评论,请期待。 :) –

+0

这是非常hacky和不可维护的,我不认为stackoverflow应该成为“谁编码高尔夫最好的”。即使是对Python有很多知识的人,在理解之前也必须仔细阅读。较少的代码=/=较好的代码。 –

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文档

注意只使用例正值设计:

多重集方法仅用于例正值设计。输入可能为负值或零,但只能创建正值的输出。没有类型限制,但值类型需要支持加法,减法和比较。 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

价值? –

+0

'In [20]'中发生了什么? – Elmex80s

+1

@RahulKP有趣的一点!应该是15.让我再检查一次。 – Kasramvd