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