Как объединить 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 defaultdictd1 = {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)}