Вступление
Нередко в Python есть два словаря, которые вы хотели бы объединить. В этой статье мы рассмотрим различные способы объединения двух словарей в Python .
Некоторые решения доступны не для всех версий Python, поэтому мы также рассмотрим способы слияния для выбранных выпусков.
При объединении словарей мы должны учитывать, что произойдет, если два словаря будут иметь одинаковые ключи. Давайте сначала определим, что должно произойти при слиянии.
Объединение словарей в Python
Слияние обычно происходит справа налево, как dict_a <- dict_b
. Если в
обоих словарях есть общий ключник, значение второго словаря
перезаписывает значение первого словаря.
Это можно продемонстрировать на приведенной ниже иллюстрации, где компоненты словаря B объединяются с A, причем зеленая масть словаря B занимает место оранжевой масти:
{.ezlazyload}
В этой статье мы будем использовать следующие словари.
- Словари со значениями:
|
|
>>> a = {1:'peanut', 2:'butter', 3:'jelly', 4:'time'}
>>> b = {1:'fish', 2:'chips'}
- Словари с вложенными значениями:
|
|
>>> c = {1: ['peanut','butter','jelly','time'], 2:['fish','chips']}
>>> d = {1: ['fish','chips'], 2:['peanut','butter','jelly','time']}
Python 3.9 и выше
Начиная с версии Python 3.9, мы можем использовать операторы слияния
(обозначенные |
) для объединения двух словарей:
>>> x = a | b
>>> print(x)
{1: 'fish', 2: 'chips', 3: 'jelly', 4: 'time'}
Операторы слияния словарей также можно использовать вместо вложенных словарей. Здесь происходит полная перезапись значения совпадающего ключа:
>>> y = c | d
>>> print(y)
{1: ['fish', 'chips'], 2: ['peanut', 'butter', 'jelly', 'time']}
Python 3 и выше
Для более ранних версий Python 3 мы, к сожалению, не можем использовать
операторы слияния. Вместо этого мы можем объединить оба словаря,
используя **
двойные звездочки, внутри другого словаря, как показано
ниже:
>>> x = {**a, **b}
>>> print(x)
{1: 'fish', 2: 'chips', 3: 'jelly', 4: 'time'}
То же самое и со словарями со значениями вложенных списков. Значения перекрывающихся ключей будут перезаписаны следующим образом:
>>> y = {**c, **d}
>>> print(y)
{1: ['fish', 'chips'], 2: ['peanut', 'butter', 'jelly', 'time']}
Python 2 и выше
В устаревших версиях Python приведенные выше фрагменты не будут
работать. Вместо этого слияние можно облегчить, объединив элементы
словаря или dict_items
обеих переменных.
Мы также можем использовать словарные методы copy()
и update()
Наконец, мы можем перебрать элементы словаря и использовать метод
extend()
чтобы добавить его в другой словарь.
Использование items ()
Начнем с объединения с items()
:
>>> x = dict(a.items() + b.items())
>>> print(x)
{1: 'fish', 2: 'chips', 3: 'jelly', 4: 'time'}
Приведенный выше синтаксис подходит для простых значений. Для вложенного
словаря, содержащего значения списка, items()
необходимо преобразовать
в list()
а затем объединить:
>>> y = dict(list(c.items()) + list(d.items()))
>>> print(y)
{1: ['fish', 'chips'], 2: ['peanut', 'butter', 'jelly', 'time']}
Это решение работает хорошо, потому что ключи были числовыми, оригинальные ключи были сохранены. Для ключей разных типов вы бы предпочли следующий вариант.
Использование обновления словаря ()
Другой способ выполнить слияние - скопировать один из словарей и обновить его другим, как показано ниже:
>>> x = a.copy()
>>> x.update(b)
>>> print (x)
{1: 'fish', 2: 'chips', 3: 'jelly', 4: 'time'}
Добавление значений списка во все версии Python
В предыдущих разделах мы перезаписали вложенные значения объединенных словарей. Бывают случаи, когда вложенные значения нужно добавлять, а не перезаписывать.
Это можно сделать с помощью extend()
как показано ниже:
>>> for k, v in d.items():
... if k in c:
... c[k].extend(v)
... else:
... c[k] = v
>>>
>>> print(c)
{1: ['peanut', 'butter', 'jelly', 'time', 'fish', 'chips'], 2: ['fish', 'chips', 'peanut', 'butter', 'jelly']}
Заключение
В этой статье мы узнали, как работает слияние словарей, и как мы можем объединить два словаря в разных версиях Python. Объединение словарей может быть очень удобно в таких ситуациях, как чтение нескольких файлов JSON, построение карты объектов или даже построение индексов контента.