Рубрики
Без рубрики

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

В этой статье мы рассмотрим различные способы объединения двух словарей в Python версии 3.9, более ранних версиях 3 и Python 2.

Автор оригинала: Sathiya Sarathi Gunasekaran.

Вступление

Нет ничего необычного в том, что в Python есть два словаря, которые вы хотели бы объединить. В этой статье мы рассмотрим различные способы объединения двух словарей в Python .

Некоторые решения доступны не для всех версий Python, поэтому мы рассмотрим способы слияния и для отдельных выпусков.

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

Слияние словарей в Python

Слияния обычно происходят справа налево, как dict_a <- dict_b . Когда в обоих словарях есть общий держатель ключа, второе значение словаря перезаписывает значение первого словаря.

Это можно продемонстрировать на приведенной ниже иллюстрации, где компоненты словаря B объединяются в A, а зеленая масть словаря B занимает место оранжевой масти:

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

В этой статье мы будем использовать следующие словари.

  • Словари со значениями:
>>> 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() dictionary. Наконец, мы можем перебирать элементы словаря и использовать метод extend () , чтобы добавить его в другой словарь.

Использование предметов()

Начнем с объединения с 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-файлов, построение карты объектов или даже построение индексов содержимого.