Почему нельзя просто взять и сложить два словаря?
Почему списки, кортежи, множества можно, а словари — нельзя? Если вам не нравится + , можно же было сделать fluent interface — чтобы dict.update() возвращал self. Самое лучшее, что я нашел — dict(dict1, key1=value1) . Пример использования:
base_config = func1(base_config + ) func2(base_config + )
Отслеживать
47.8k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 24 июн 2015 в 14:06
Smit Johnth Smit Johnth
838 2 2 золотых знака 7 7 серебряных знаков 18 18 бронзовых знаков
В чём проблема с func1(base_config, key2=’val2′) ?
24 июн 2015 в 19:06
В том, что func принимает dict? Вы кое-что путаете.
24 июн 2015 в 19:08
1. Изменить func() , чтобы **kwargs принимала 2. Или явно dict() создавать: func1(dict(base_config, key2=’val2′))
24 июн 2015 в 19:10
@jfs а если функция не ваша?
24 июн 2015 в 19:32
обратите внимание на пункт 2 в моем предыдущем комментарии.
24 июн 2015 в 19:35
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
объединение словарей с помощью | (union) операции: более левые ключи (как у | операции для set) выигрывают и более правые (поздние) значения выигрывают (как dict_add_keep_last() ниже).
Есть также и по месту операция (изменяет словарь) и можно передавать не только словари:
>>> d = >>> d |= [(False, 'A'), (2, 'C')] >>> d
Потому что не ясно какую операцию + должен реализовывать для словарей. И предпочтительные для каждого конкретного случая варианты легко реализовать.
Explicit is better than implicit. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it.
Because there so many different ways to think about this, it’s better not to guess and force the user to be explicit.
result = +
Возможны разные ответы:
-
сохранять только последние значения (PEP-0584 поведение)
result =
можно реализовать так:
def dict_add_keep_last(a, b): # aka merged() or updated() d = a.copy() d.update(b) return d
В специальных случаях, когда ключи являются строками можно без функции обойтись (в Питоне 2 (CPython) также разрешены произвольные ключи), пример:
result = dict(a, **b) # результат тот же
result =
result = <**b, **a># Python 3.5, or else swap a, b: dict_add_keep_last(b, a)
>>> from collections import Counter >>> Counter(a) + Counter(b) Counter()
result =
Никакой из представленных вариантов не является более очевидным (точнее разные люди могут считать разные варианты более очевидными). Более того, каждый из этих вариантов имеет право на существование и они не всегда взаимозаменяемы. Различные варианты сложения словарей используются не очень часто, поэтому важно, чтобы в каждом случае явно было указано, какой тип операции используется и не нужно было гадать (ошибки менее вероятны).
Идея обсуждалась в списке рассылки (python-ideas) неоднократно:
- «Adding «+» and «+=» operators to dict» (2015)
- «adding dictionaries» (2014)
- «dict ‘+’ operator and slicing support for pop» (2009)
Мелкие замечания (не имеют отношения к «почему», но полезны для темы «сложить два словаря»):
-
тип возвращаемого значения для a + b выражения, как обычно, не очевиден и может зависеть от типа a и b например, выражение a += b , может «поменять» тип a :
>>> from decimal import Decimal >>> a = 1 >>> a += Decimal(2) >>> a Decimal('3')
for it in [b, c, d, ..]: a.update(it)
try: from collections import ChainMap except ImportError: # Python 2 from ConfigParser import _Chainmap as ChainMap
Если вам не нравится +, можно же было сделать fluent interface — чтобы dict.update() возвращал self.
Потому что в Питоне методы, которые изменяют объект, обычно возвращают None , типичный пример: some_list.sort() vs. sorted(some_list) . Питон следует принципу Command–query separation.
Как объединить словари в Python
В Python словарь – это коллекция, которую вы используете для хранения данных в парах . Словарь является упорядоченной и изменяемой структурой. Кроме того, он не может хранить повторяющиеся данные. В этой статье мы расскажем, как объединить словари в Python и как это можно сделать разными способами.
Итак, давайте начнем с того, что же представляет из себя словарь вообще. Мы пишем словарь, используя фигурные скобки. Это выглядит следующим образом:
my_dict =
Иногда нам нужно объединить два или более словарей, чтобы создать словарь большего размера. К примеру, у нас есть словари dict_one и dict_two :
dict_one = < "id": 1, "name": "Ashutosh", "books": ["Python", "DSA"] >dict_two = < "college": "NSEC", "city": "Kolkata", "country": "India" >merged_dict =
В merged_dict у нас есть пары ключ-значение как из словаря dict_one , так и из dict_two . Это то, чего мы и хотим достичь с помощью кода.
В Python есть несколько способов сделать объединить словари. Вы можете использовать:
- цикл for
- метод dict.update()
- оператор **
- оператор объединения | (доступно для Python 3.9 и выше)
Давайте исследуем каждый из этих вариантов по порядку!
Как объединить словари в Python с помощью цикла for
Мы можем объединить два или более словарей, используя цикл for следующим образом:
dict_one = < "id": 1, "name": "Ashutosh", >dict_two = < "books": ["Python", "DSA"], "college": "NSEC", >dict_three = < "city": "Kolkata", "country": "India" >for key,value in dict_two.items(): merged_dict[key] = value merged_dict # for key,value in dict_three.items(): merged_dict[key] = value merged_dict #
Но проблема данного метода в том, что нам приходится запускать такой цикл для объединения словарей множество раз. Если нам просто нужно объединить два словаря, то это не будет проблемой. Но если у нас уже три словаря, то код становится громоздким. Что уж говорить о случаях, когда у нас больше трех словарей!
Очевидно, что данный метод не соответствует одному из главных принципов написания кода в Python – DRY (Don’t repeat yourself – не повторяйся). Поэтому данный цикл for можно, к примеру, поместить в функцию, и тогда код станет явно чище. Однако всё-таки это слишком замороченный способ для такой простой задачи, как объединение словарей. Поэтому стоит поискать уже готовые, встроенные в Python решения.
Итак, какой у нас есть еще вариант?
Как объединить словари в Python с помощью метода dict.update()
Самый очевидный путь – найти уже готовую функцию, то есть посмотреть на то, какие есть встроенные методы у словарей. Если вы исследуете класс словарей dict , вы найдете много различных методов. Один из них — метод update() , который можно использовать для «вливания» одного словаря в другой. Он нам и нужен! Решение нашей задачи с помощью этого метода будет выглядеть следующим образом:
dict_one = < "id": 1, "name": "Ashutosh", "books": ["Python", "DSA"] >dict_two = < "college": "NSEC", "city": "Kolkata", "country": "India" >dict_one.update(dict_two) dict_one #
Но с использованием метода update() связана одна проблема. Этот метод изменяет один из словарей. Если мы хотим создать третий словарь без изменения исходных, мы не можем использовать этот метод.
Кроме того, мы можем использовать этот метод только для объединения двух словарей за раз. Если мы захотим объединить три словаря, то нам сначала придется объединить первые два, а затем добавить третий к измененному словарю.
То есть мы имеем ту же проблему, что и при объединении словарей в цикле: для двух словарей – это рабочий вариант. Однако в случае трех и более словарей, становится уже неудобно. Для трех словарей код будет выглядеть следующим образом:
dict_one = < "id": 1, "name": "Ashutosh", >dict_two = < "books": ["Python", "DSA"], "college": "NSEC", >dict_three = < "city": "Kolkata", "country": "India" >dict_one.update(dict_two) dict_one # dict_one.update(dict_three) dict_one #
Давайте рассмотрим другие варианты.
Как объединить словари в Python с помощью оператора **
Вы можете использовать метод двойной звездочки ( ** ) для распаковки или расширения словаря. К примеру, это может выглядеть следующим образом:
dict_one = < "id": 1, "name": "Ashutosh", >dict_two = < "books": ["Python", "DSA"] "college": "NSEC", >dict_three = < "city": "Kolkata", "country": "India" >merged_dict = <**dict_one, **dict_two, **dict_three>merged_dict #
При использовании оператора ** для объединения словарей исходные словари не изменяются. Поэтому данный метод крайне удобен, если мы хотим объединить словари в один, при этом не затрагивая их самих.
Кроме того, данный вариант также отлично подойдет, если нам нужно объединить три и более словарей. Нужно просто через запятую указать все словари, которые вы хотите включить в новый объединенный. Не забудьте перед каждым словарем указать двойные звездочки ** .
Этот способ, однозначно, превосходит первые два и хорош в использовании. Но давайте рассмотрим ещё один.
Как объединить словари в Python с помощью оператора |
Начиная с Python 3.9, мы можем использовать оператор | для объединения двух или более словарей. Это выглядит следующим образом:
dict_one = < "id": 1, "name": "Ashutosh", >dict_two = < "books": ["Python", "DSA"], "college": "NSEC", >dict_three = < "city": "Kolkata", "country": "India" >merged_dict = dict_one | dict_two | dict_three merged_dict #
Это наиболее удобный способ объединения словарей в Python. Это простое и элегантное решение, которое стоит взять на заметку и использовать. Единственное, что стоит учитывать – это версию Python, которая установлена на ваш компьютер. Советуем обновить Python до последней версии и использовать все дополнительные «плюшки». Подробнее про улучшение Python в версии 3.9 можно почитать здесь.
Заключение
Таким образом, мы исследовали несколько различных методов объединения словарей. Если у вас Python 3.9 или выше, следует использовать оператор | . Но если вы по какой-то причине используете более старые версии Python и не хотите переходить на версию 3.9 и выше, вы можете использовать другие методы. Конечно, в таком случае лучше всего подойдет метод двойной звездочки ** . Однако в некоторых случаях можно использовать и цикл for , и метод update() .
Одним словом, выбирайте то, что вам больше по душе! Надеемся, что данная статья была вам полезна! Успехов в написании кода!
Как объединить словари в Python
Статьи
Автор Admin На чтение 3 мин Просмотров 388 Опубликовано 17.03.2023
Введение
В ходе статьи разберём различные способы объединить словари в языке программирования Python.
Объединение словарей в Python 3.9+
Начиная с версии Python 3.9 появилась возможность объединить два словаря при помощи оператора слияния (|).
x = y = z = x | y print(z) # Вывод:
Объединение словарей в Python 3.5-3.8
В версиях Python начиная с 3.5, по 3.9 предыдущий способ к сожалению не работал. Вместо оператора слияния используется распаковка обоих словарей при помощи двойных звёздочек (**):
x = y = z = <**x, **y>print(z) # Вывод:
Использование методов copy() и update()
В данном способе мы методом copy() копируем первый словарь в z, после чего обновляем получившийся словарь z методом update(), тем самым добавляя в него значения второго словаря:
x = y = z = x.copy() z.update(y) print(z) # Вывод:
Также можно было обойтись без создания нового словаря, а добавить в первый данные из второго:
x = y = x.update(y) print(x) # Вывод:
Использование метода items()
В данном способе мы добавляем данные из первого и второго словаря в списки с кортежами. Далее мы их складываем оператором сложения (+) и преобразовываем в словарь:
x = y = z = dict(list(x.items()) + list(y.items())) print(z) # Вывод:
Получается, что словарь x превращается в список кортежей — [(‘a’, 10), (‘b’, 8)].
Словарь y тоже превращается в список кортежей — [(‘c’, 6), (‘d’, 4)].
И т.к. они находятся в скобках функции dict() получается такая картина:
z = dict([('a', 10), ('b', 8)] + [('c', 6), ('d', 4)])
Ну и как мы знаем, функция dict() преобразовывает их в словарь.
Заключение
В ходе статьи мы с Вами научились объединять словари в Python различными способами. Надеюсь Вам понравилась статья, желаю удачи и успехов!
Как объединить два словаря в Python

В этой статье мы рассмотрим различные способы объединения двух словарей в Python.
Введение
Часто бывают ситуации, когда в Python есть два словаря, которые вы хотели бы объединить.
Некоторые решения доступны не для всех версий Python, поэтому мы рассмотрим способы слияния для отдельных выпусков.
При объединении словарей мы должны учитывать что произойдет, если два словаря будут иметь одинаковые ключи. Давайте сначала определим, что должно произойти при слиянии словарей.
Объединение словарей
В этой статье мы будем использовать два словаря, а именно:
Словари со значениями
a = b =
Словари с вложенными значениями
c = d =
Объединение словарей в Python 3.9+
Начиная с версии Python 3.9, мы можем использовать операторов слияния (знак | ) ставится для объединения двух словарей:
x = a | b print(x)
Для слияния словарей также могут использоваться операторы, вместо вложенных словарей. Здесь происходит полная перезапись значения совпадающего ключа:
y = c | d print(y)
Объединение словарей до Python 3.9
К сожалению, на более ранних версий Python 3 мы не можем использовать операторов слияния. Но, вместо этого мы можем выполнить слияние, распаковав оба словаря, используя ** двойные звездочки, внутри другого словаря, как показано ниже:
x = <**a, **b>print(x)
То же самое и со словарями со значениями вложенных списков. Значения дублирующихся ключей будут перезаписаны следующим образом:
y = <**c, **d>print(y)
Объединение словарей в Python 2
В устаревших версиях Python приведенные выше фрагменты не будут работать. В более поздних версиях слияние может быть облегчено путем объединения элементов словаря или dict_items обеих переменных.
Мы также можем использовать словарные методы copy() и update(). Включая этот, extend() он нам нужен для добавления его (данного словаря) в другой словарь.
Использование метода items()
Начнем с объединения с items():
x = dict(a.items() + b.items()) print(x)
Приведенный выше синтаксис подходит для простых значений. Для вложенного словаря, содержащего значения списка, items() вызов необходимо преобразовать в list() а затем объединить:
y = dict(list(c.items()) + list(d.items())) print(y)
Это решение работает хорошо, потому что ключи были числовыми, оригинальные ключи были сохранены. Для ключей разных типов вы можете предпочитать разные варианты.
Использование метода update()
Другой способ выполнить слияние — скопировать один из словарей и обновить его другим, как показано ниже:
x = a.copy() x.update(b) print (x)
Добавление значений списка во все версии Python
В предыдущих разделах мы перезаписали вложенные значения объединенных словарей. Бывают случаи, когда вложенные значения нужно добавлять, а не перезаписывать.
Это можно сделать, используя метод extend() показанный ниже:
for k, v in d.items(): if k in c: c[k].extend(v) else: c[k] = v print(c)
Вывод
В этой статье мы узнали о том, как работает слияние словарей, и как мы можем объединить два словаря в разных версиях Python. Объединение словарей может быть очень удобным в таких ситуациях, как чтение нескольких файлов JSON, построение карты объектов или даже построение индексов контента.
