如何合并多个相同的密钥的字典?

我有这样的多个字典/键值对:

d1 = {key1: x1, key2: y1) d2 = {key1: x2, key2: y2) 

我希望结果是一个新的字典(如果可能,以最有效的方式):

 d = {key1: (x1, x2), key2: (y1, y2)} 

其实我想要的结果是:

 d = {key1: (x1.x1attrib, x2.x2attrib), key2: (y1.y1attrib, y2.y2attrib)} 

但是,我猜如果有人告诉我如何得到第一个结果,我可以找出其余的。

假设所有的密钥总是存在于所有的字典中:

 ds = [d1, d2] d = {} for k in d1.iterkeys(): d[k] = tuple(d[k] for d in ds) 

下面是一个通用的解决scheme,它可以处理任意数量的字典,当键只存在于某些字典中的时候:

 from collections import defaultdict d1 = {1: 2, 3: 4} d2 = {1: 6, 3: 7} dd = defaultdict(list) for d in (d1, d2): # you can list as many input dicts as you want here for key, value in d.iteritems(): dd[key].append(value) print(dd) 

显示:

 defaultdict(<type 'list'>, {1: [2, 6], 3: [4, 7]}) 

另外,要获得.attrib ,只需将append(value)更改为append(value.attrib)

如果你只有d1和d2,

 from collections import defaultdict d = defaultdict(list) for a, b in d1.items() + d2.items(): d[a].append(b) 

下面是一个可以使用的方法,即使两个字典都没有相同的密钥,

 d1 = {'a':'test','b':'btest','d':'dreg'} d2 = {'a':'cool','b':'main','c':'clear'} d = {} for key in set(d1.keys() + d2.keys()): try: d.setdefault(key,[]).append(d1[key]) except KeyError: pass try: d.setdefault(key,[]).append(d2[key]) except KeyError: pass print d 

这将产生下面的input:

 {'a': ['test', 'cool'], 'c': ['clear'], 'b': ['btest', 'main'], 'd': ['dreg']} 
 def merge(d1, d2, merge): result = dict(d1) for k,v in d2.iteritems(): if k in result: result[k] = merge(result[k], v) else: result[k] = v return result d1 = {'a': 1, 'b': 2} d2 = {'a': 1, 'b': 3, 'c': 2} print merge(d1, d2, lambda x, y:(x,y)) {'a': (1, 1), 'c': 2, 'b': (2, 3)} 

Python 3.x更新

来自Eli Bendersky回答:

Python 3删除了dict.iteritems,而是使用dict.items。 请参阅Python wiki: https : //wiki.python.org/moin/Python3.0

 from collections import defaultdict dd = defaultdict(list) for d in (d1, d2): for key, value in d.items(): dd[key].append(value) 

紧凑的可能性

 d1={'a':1,'b':2} d2={'c':3,'d':4} context={**d1, **d2} context {'b': 2, 'c': 3, 'd': 4, 'a': 1}