如何合并字典,收集匹配键的值?
我有多个字典(或者说是一组键值对),像这样:
d1 = {key1: x1, key2: y1}
d2 = {key1: x2, key2: y2}
我该怎么做,才能高效地得到一个新的字典,结果像这样呢?
d = {key1: (x1, x2), key2: (y1, y2)}
17 个回答
13
这个函数可以把两个字典合并在一起,即使这两个字典里的键不一样也没关系:
def combine_dict(d1, d2):
return {
k: tuple(d[k] for d in (d1, d2) if k in d)
for k in set(d1.keys()) | set(d2.keys())
}
举个例子:
d1 = {
'a': 1,
'b': 2,
}
d2 = {
'b': 'boat',
'c': 'car',
'd': 'donkey',
}
combine_dict(d1, d2)
# Returns: {
# 'a': (1,),
# 'b': (2, 'boat'),
# 'c': ('car',),
# 'd': ('donkey'),
# }
128
这里有一个通用的解决方案,可以处理任意数量的字典,并且能够应对某些字典中只有部分键的情况:
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.items():
dd[key].append(value)
print(dd) # result: defaultdict(<type 'list'>, {1: [2, 6], 3: [4, 7]})
67
假设所有的键在所有字典中都是存在的:
ds = [d1, d2]
d = {}
for k in d1.iterkeys():
d[k] = tuple(d[k] for d in ds)
注意:在Python 3.x中使用下面的代码:
ds = [d1, d2]
d = {}
for k in d1.keys():
d[k] = tuple(d[k] for d in ds)
如果字典中包含numpy数组的话:
ds = [d1, d2]
d = {}
for k in d1.keys():
d[k] = np.concatenate(list(d[k] for d in ds))