如何合并多个相同的密钥的字典?
我有这样的多个字典/键值对:
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}