2012-08-22 44 views
3

我的線沿線的一個嵌套的字典:嵌套字典使用不同的密鑰總結項目

{'apple': {'a': 1, 'b': 4, 'c': 2}, 
'orange': {'a': 4, 'c': 5}, 
'pear': {'a': 1, 'b': 2}} 

我想要做的就是擺脫外鍵,總結內鍵的值是什麼讓我有一個新的字典,它看起來像:

{'a': 6, 'b': 6, 'c': 7} 

回答

7

可以使用Counter類:

>>> from collections import Counter 

>>> d = {'apple': {'a': 1, 'b': 4, 'c': 2}, 'orange': {'a': 4, 'c': 5}, 'pear': {'a': 1, 'b': 2}} 
>>> sum(map(Counter, d.values()), Counter()) 
Counter({'c': 7, 'a': 6, 'b': 6}) 
+0

太棒了!正是我需要的。感謝您的快速反應每個人 – user1600653

3
from collections import defaultdict 
d = defaultdict(int) 
for dct in yourdict.values(): 
    for k,v in dct.items(): 
     d[k] += v 

這個答案的主要優點是,它的作品回的python2.5。對於python2.7 +,請參閱由@DSM和@BigYellowCactus發佈的解決方案。

2

Counter目的是爲了使這樣的事情很簡單:

>>> from collections import Counter 
>>> d = {'apple': {'a': 1, 'b': 4, 'c': 2}, 'orange': {'a': 4, 'c': 5}, 'pear': {'a': 1, 'b': 2}} 
>>> sum((Counter(v) for v in d.itervalues()), Counter()) 
Counter({'c': 7, 'a': 6, 'b': 6}) 
+0

I假設如果我只是切換到python2.7,我也可以進入這個簡潔的'Counter'操作。很好地完成(+1) – mgilson

+0

如果沒有其他原因,您應該切換到2.7,而不是回答SO問題。 :^) – DSM

+0

我實際上並不經常使用這些數據結構 - 所以我在'itertools'和'collections'(以及可能是stdlib中的一堆其他模塊)中學到的大部分內容都是回答這個問題... – mgilson

3

這裏是另一個collections.Counter的解決方案,它不是一個像其他人一樣,但我認爲它更清潔:

from collections import Counter 
d = {'apple': {'a': 1, 'b': 4, 'c': 2}, 'orange': {'a': 4, 'c': 5}, 'pear': {'a': 1, 'b': 2}} 

counts = Counter() 
for v in d.values(): 
    counts.update(v) 
+0

嗯......誰知道'update'增加了值而不是替換它們? (顯然你做了+1)。 – mgilson

+0

我喜歡這個。有時'for'循環是最乾淨的方法。 – DSM

相關問題