如何合并字典,收集匹配键的值?

155 投票
17 回答
287299 浏览
提问于 2025-04-16 17:20

我有多个字典(或者说是一组键值对),像这样:

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

我该怎么做,才能高效地得到一个新的字典,结果像这样呢?

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

另见:在Python中如何创建一个有重复键的字典?.

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))

撰写回答