2013-10-19 99 views
2

我具有相等長度的Python字典的任意數量的具有匹配的密鑰組,如下所示:薩姆相應的元件

{'a':1, 'b':4, 'c':8, 'd':9} 

{'a':2, 'b':3, 'c':2, 'd':7} 

{'a':0, 'b':1, 'c':3, 'd':4} 
... 

我怎樣才能獲得單個字典具有相同的密鑰集合但將值作爲字典集中相應元素的總和?換句話說,我會想:

{'a':3, 'b':8, 'c':13, 'd':20} 

也許有一個醜陋的,複雜的循環結構,但有沒有更好的辦法了某種列表/字典理解聰明的做到這一點?試想想起來了,我真的不知道如何做一個醜陋的循環版本,反正..

+0

原始字典存在哪裏?他們都是單獨命名的嗎?或者它們存在於一個集合或一系列字典中? – lurker

+0

它們通過更大的整體字典中的id號索引。我希望能夠求和某些可變大小的子集(例如,具有鍵1,5,34和67的子集)。 – nicole

+0

如果您創建了一個詞典列表,例如'DList = [d [1],d [5],d [34],d [67]]',您仍然可以使用@TimPeters的答案和您的ID號碼如果你在網站的其他地方搜索關於從指定元素中創建列表的方式來編程生成該列表......) – beroe

回答

12

collections.Counter()救援;-)

from collections import Counter 
dicts = [{'a':1, 'b':4, 'c':8, 'd':9}, 
     {'a':2, 'b':3, 'c':2, 'd':7}, 
     {'a':0, 'b':1, 'c':3, 'd':4}] 
c = Counter() 
for d in dicts: 
    c.update(d) 

然後:

>>> print c 
Counter({'d': 20, 'c': 13, 'b': 8, 'a': 3}) 

或者你可以把它改回字典:

>>> print dict(c) 
{'a': 3, 'c': 13, 'b': 8, 'd': 20} 

Counter()無關緊要是否所有th e輸入字典具有相同的密鑰。如果您肯定知道,他們這樣做,你可以嘗試可笑;-)單行這樣的:

d = {k: v for k in dicts[0] for v in [sum(d[k] for d in dicts)]} 

Counter()更清晰,更快捷,更靈活。說句公道話,雖然,這個幾乎沒有雷人的班輪少可笑:

d = {k: sum(d[k] for d in dicts) for k in dicts[0]} 
+0

不錯。我喜歡你的「不那麼可笑」的版本,但是如果你在目的字典中使用除「d」之外的東西,它可能會更清晰...... – beroe

+0

@beroe,但那會讓它更不可笑! ;-) –

+0

對不起,我的壞!我認爲這是[遞歸] ...:^) – beroe

2

如果你只是想只用dict,您可以使用此

dicts = [{'a':0, 'b':4, 'c':8, 'd':9}, 
     {'a':0, 'b':3, 'c':2, 'd':7}, 
     {'a':0, 'b':1, 'c':3, 'd':4}] 

result = {} 
for myDict in dicts: 
    for key, value in myDict.items(): 
     result.setdefault(key, 0) 
     result[key] += value 
print result 

輸出:

{'a': 0, 'c': 13, 'b': 8, 'd': 20}