2017-03-09 51 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