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