2013-02-19 42 views
0

我有很多类型的字典,我给2这个例子:更新或添加键类型的字典

dict1={'green': 3, 'yellow': 5, 'blue': 1} 
dict2={'green': 5, 'yellow': 1, 'blue': 3, 'purple': 10} 

我一直试图找到一种方法来添加2种类型的字典所以我可以有更新的值(总和),并为不存在的键添加键和值。

结果:

results = {'green': 8, 'yellow': 6, 'blue': 4, 'purple': 10} 

我试图dict1.update(dict2)但你知道,我只带了具有更新值的字典,而不是总结出来的。

任何方法来实现这一目标?

UPDATE:

解决:其实collections.Counter的伎俩...感谢

+0

使用collections.Counter。 – mgilson 2013-02-19 17:49:27

+0

你想为重复键发生什么?例如,你想'绿色'被映射到3,5,3 + 5或其他东西吗? – 2013-02-19 17:50:19

+0

@KyleStrand:3 + 5,请参阅示例'results'字典。 – 2013-02-19 17:50:59

回答

0

咦,那是出奇的难...

dicts = [dict1, dict2] 
dict([(key, sum(map(lambda x: x.get(key) or 0, dicts))) for key in set(reduce(lambda a,b: a + b, map(lambda x: x.keys(), dicts), []))]) 

[{'blue':1,'green':3,'yellow':5},{'blue':3,'purple':10,'green':5,'yellow':1}]

或者更可读

dicts = [dict1, dict2] 
keys = reduce(lambda a,b: a + b, map(lambda x: x.keys(), dicts), []) 
dict([(key, sum(map(lambda x: x.get(key) or 0, dicts))) for key in set(keys)]) 
0
{x: dict1.get(x,0) + dict2.get(x,0) for x in set(dict1.keys() + dict2.keys())} 

输出:

{'blue': 4, 'purple': 10, 'green': 8, 'yellow': 6}