Вопрос-Ответ

How to merge dicts, collecting values from matching keys?

Как объединить dicts, собирая значения из совпадающих ключей?

У меня есть несколько dicts (или последовательностей пар ключ-значение), подобных этому:

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

Как я могу эффективно получить подобный результат в виде нового dict?

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

Смотрите также: Как можно создать словарь с дублирующимися ключами в Python?.

Переведено автоматически
Ответ 1

Вот общее решение, которое будет обрабатывать произвольное количество словарей, в случаях, когда ключи есть только в некоторых из словарей:

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]})
Ответ 2

предполагая, что все ключи всегда присутствуют во всех dicts:

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)

а если dic содержат массивы numpy:

ds = [d1, d2]
d = {}
for k in d1.keys():
d[k] = np.concatenate(list(d[k] for d in ds))
Ответ 3

Эта функция объединяет два dicts, даже если ключи в двух словарях разные:

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'),
# }
Ответ 4
dict1 = {'m': 2, 'n': 4}
dict2 = {'n': 3, 'm': 1}

Убедитесь, что ключи расположены в одинаковом порядке:

dict2_sorted = {i:dict2[i] for i in dict1.keys()}

keys = dict1.keys()
values = zip(dict1.values(), dict2_sorted.values())
dictionary = dict(zip(keys, values))

дает:

{'m': (2, 1), 'n': (4, 3)}
2023-04-26 21:11 python dictionary