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

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

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

Введение

Часто бывают ситуации, когда в Python есть два словаря, которые вы хотели бы объединить.

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

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

Объединение словарей

Слияния обычно происходят справа налево, так как dict_a <- dict_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.9

К сожалению, на более ранних версий 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']}

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

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

Другой способ выполнить слияние — скопировать один из словарей и обновить его другим, как показано ниже:

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, построение карты объектов или даже построение индексов контента.




Егор Егоров

Программирую на Python с 2017 года. Люблю создавать контент, который помогает людям понять сложные вещи. Не представляю жизнь без непрерывного цикла обучения, спорта и чувства юмора.

Ссылка на мой github есть в шапке. Залетай.

Оцените автора
Егоров Егор
Добавить комментарий

  1. Аноним

    НЕ ПОНЯТНО!!!
    for k, v in d.items():
    if k in c:
    c[k].extend(v)
    else:
    c[k] = v
    print(c)

    Ответить
  2. Аноним

    Вы бы хоть пояснения давали к строчкам. В последнем примере вообще ничего не понятно

    Ответить