В предыдущем уроке мы узнали о словарях 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 с нашим полным руководством по питону, независимо от того, начинаете ли вы или начинающий программист, ищущий новые навыки.