2013-10-19 40 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}