Статьи

Как объединить два словаря Python

В предыдущем уроке мы узнали о словарях Python и увидели, что они считаются неупорядоченными наборами с парой key/value , где ключи используются для доступа к элементам, а не к позиции, как, например, в списках .

В этом кратком совете я собираюсь показать вам, как объединить (объединить) два словаря вместе.

Допустим, у нас есть следующие два словаря:

1
2
dict1 = {‘bookA’: 1, ‘bookB’: 2, ‘bookC’: 3}
dict2 = {‘bookC’: 2, ‘bookD’: 4, ‘bookE’: 5}

Как мы можем объединить эти два словаря в один словарь? В этом отношении мы можем использовать функцию update([other]) . Как указано в документации Python:

Обновите словарь парами ключ / значение из других , перезаписав существующие ключи. Возврат None .

update() принимает либо другой объект словаря, либо итерацию пар ключ / значение (в виде кортежей или других итераций длиной два). Если заданы аргументы ключевого слова, словарь обновляется этими парами ключ / значение: d.update(red=1, blue=2) .

Итак, чтобы объединить два вышеупомянутых словаря, мы можем набрать следующее:

dict2.update(dict1)

Скажем, что вы набрали следующее утверждение, чтобы просмотреть результаты:

print dict2.update(dict1)

В этом случае вы получите None ! Это потому, что функция update() не возвращает новый словарь. Чтобы получить результат конкатенации, просто введите следующее:

print dict2

В этом случае вы получите следующий вывод:

{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}

Что делать, если мы сделали следующее?

1
2
dict1.update(dict2)
print dict1

В этом случае вы получите следующий вывод:

{'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5}

Обратите внимание, что в первом случае, dict2.update(dict1) , мы обновляем словарь dict2 ключ / значение из dict1 и перезаписываем любые существующие ключи. Существующий ключ, как мы можем заметить, это 'bookC' , который в этом случае будет иметь значение 3 , поскольку мы обновляем пары ключ / значение из dict1 . Это будет полностью изменено в последнем случае, dict1.update(dict2) , где мы обновляем словарь dict1 ключ / значение из dict2 .

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

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

print dict(dict2, **dict1)

Результат этого утверждения:

{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}

Таким образом, dict1 переопределяет dict2 . Если мы хотим, чтобы dict2 переопределил dict1 , мы dict1 :

print dict(dict1, **dict2)

Выход в этом случае будет:

{'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5}

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

Обходной путь для этого может быть следующим (взятый из ответа в этом потоке StackOverflow ):

01
02
03
04
05
06
07
08
09
10
from itertools import chain
from collections import defaultdict
dict1 = {‘bookA’: 1, ‘bookB’: 2, ‘bookC’: 3}
dict2 = {‘bookC’: 2, ‘bookD’: 4, ‘bookE’: 5}
dict3 = defaultdict(list)
for k, v in chain(dict1.items(), dict2.items()):
    dict3[k].append(v)
 
for k, v in dict3.items():
    print(k, v)

Выход в этом случае будет:

1
2
3
4
5
(‘bookA’, [1])
(‘bookB’, [2])
(‘bookC’, [3, 2])
(‘bookD’, [4])
(‘bookE’, [5])

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

Изучите Python с нашим полным руководством по питону, независимо от того, начинаете ли вы или начинающий программист, ищущий новые навыки.