Объединить два диктанта одним ключом

У меня есть следующие две игрушечные диктовки

d1 = {
 'a': [2,4,5,6,8,10],
 'b': [1,2,5,6,9,12],
 'c': [0,4,5,8,10,21]
 }
d2 = {
 'a': [12,15],
 'b': [14,16],
 'c': [23,35]
  }

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

Я пробовал следующий код

d_comb = {key:[d1[key], d2[key]] for key in d1}

но вывод, который я получаю, имеет два списка в списке для каждого ключа, т.е.

{'a': [[2, 4, 5, 6, 8, 10], [12, 15]],
 'b': [[1, 2, 5, 6, 9, 12], [14, 16]],
 'c': [[0, 4, 5, 8, 10, 21], [23, 35]]}

тогда как я хотел бы получить

{'a': [2, 4, 5, 6, 8, 10, 12, 15],
 'b': [1, 2, 5, 6, 9, 12, 14, 16],
 'c': [0, 4, 5, 8, 10, 21, 23, 35]}

Как я могу сделать это с строкой или двумя кодами?

Ответы

Ответ 1

Вы почти получили это, вместо этого используйте + чтобы добавить оба списка:

{key: d1[key] + d2[key] for key in d1}

{'a': [2, 4, 5, 6, 8, 10, 12, 15],
 'b': [1, 2, 5, 6, 9, 12, 14, 16],
 'c': [0, 4, 5, 8, 10, 21, 23, 35]}

Ответ 2

если не все ключи от d2 находятся в d1, то самое простое - использовать set union и dict.get:

combined_keys = d1.keys() | d2.keys()
d_comb = {key: d1.get(key, []) + d2.get(key, []) for key in combined_keys}

Ответ 3

Вы можете использовать расширенную итеративную распаковку:

d1 = {
 'a': [2,4,5,6,8,10],
 'b': [1,2,5,6,9,12],
 'c': [0,4,5,8,10,21]
 }
d2 = {
 'a': [12,15],
 'b': [14,16],
 'c': [23,35]
  }

d_comb = {key:[*d1[key], *d2[key]] for key in d1}

print(d_comb)

Выход

{'c': [0, 4, 5, 8, 10, 21, 23, 35], 'b': [1, 2, 5, 6, 9, 12, 14, 16], 'a': [2, 4, 5, 6, 8, 10, 12, 15]}

Ответ 4

Код будет работать независимо от того, имеют ли d1 или d2 одинаковый набор ключей. Я добавил ключ 'e' в d1 и 'd' в d2.

d1 = {'a': [2, 4, 5, 6, 8, 10], 'b': [1, 2, 5, 6, 9, 12], 'c': [0, 4, 5, 8, 10, 21], 'e':[0,0,0]}
d2 = {'a': [12, 15], 'b': [14, 16], 'c': [23, 35], 'd': [13, 3]}

d2_keys_not_in_d1 = d2.keys() - d1.keys()
d1_keys_not_in_d2 = d1.keys() - d2.keys()
common_keys = d2.keys() & d1.keys()

for i in common_keys:
    d[i]=d1[i]+d2[i]
for i in d1_keys_not_in_d2:
    d[i]=d1[i]
for i in d2_keys_not_in_d1:
    d[i]=d2[i]
d
{'a': [2, 4, 5, 6, 8, 10, 12, 15],
 'b': [1, 2, 5, 6, 9, 12, 14, 16],
 'c': [0, 4, 5, 8, 10, 21, 23, 35],
 'd': [13, 3],
 'e': [0, 0, 0]}

Ответ 5

Вы можете использовать itertools.chain для эффективного создания единого списка из списков ввода:

from itertools import chain
d_comb = {key: list(chain(d1[key], d2[key])) for key in d1}

Для более общего случая, охватывающего произвольное количество словарей и ключей, которые не равны между словарями, см. Объединение списков значений словаря в Python.