python — Сложение списка словарей

Вопрос задан

Изменён 1 год 3 месяца назад

Просмотрен 134 раза

Есть два списка:

list_one = [{"name": "Alex", "value": 1}, {"name": "Bob", "value": 2}]
list_two = [{"name": "Alex", "value": 1}, {"name": "Bob", "value": 2}]

Нужно их сложить так что бы получился третий такого вида:

list_three = [{"name": "Alex", "value": 2}, {"name": "Bob", "value": 4}]

Первые два списка словарей всегда будут одинаковые по длине и словари будут отличатся только значением «value». То есть поле «name» первого словаря будет совпадать с полем «name» первого элемента второго словаря. Через цикл не совсем корректно это делать, так как словарей в списке может быть до тысячи.

  • python
  • python-3.x
3

Вы, конечно, можете поизощряться с модулем collections, но мне кажется, что работа с табличным форматом будет и удобнее и быстрее:

import pandas as pd
list_one = [{"name": "Alex", "value": 1}, {"name": "Bob", "value": 2}]
list_two = [{"name": "Alex", "value": 1}, {"name": "Bob", "value": 2}]
res = pd.DataFrame(list_one+list_two).groupby("name", as_index=False).sum().to_dict("records")
print(res)

[{‘name’: ‘Alex’, ‘value’: 2}, {‘name’: ‘Bob’, ‘value’: 4}]

UPDATE:

Если нужно складывать значения по модулю (абсолютные), то делаем так:

res = pd.DataFrame(list_one+list_two).groupby("name", as_index=False)["value"].apply(lambda x:x.abs().sum()).to_dict("records")

UPDATE 2:

Для вычитания можно сделать так (принимая во внимание, что списков всего два):

res = pd. DataFrame(list_one+list_two).groupby("name", as_index=False)["value"].apply(lambda x:x.iloc[0] - x.iloc[-1]).to_dict("records")
3

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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

В Python словарь – это коллекция, которую вы используете для хранения данных в парах {ключ : значение}. Словарь является упорядоченной и изменяемой структурой. Кроме того, он не может хранить повторяющиеся данные. В этой статье мы расскажем, как объединить словари в Python и как это можно сделать разными способами.

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

my_dict = { "id": 1, "name": "Ashutosh", "books": ["Python", "DSA"] }

Иногда нам нужно объединить два или более словарей, чтобы создать словарь большего размера. К примеру, у нас есть словари dict_one и dict_two:

dict_one = {
    "id": 1,
    "name": "Ashutosh",
    "books": ["Python", "DSA"]
}
dict_two = {
    "college": "NSEC",
    "city": "Kolkata",
    "country": "India"
}
merged_dict = {
    "id": 1,
    "name": "Ashutosh",
    "books": ["Python", "DSA"],
    "college": "NSEC",
    "city": "Kolkata",
    "country": "India"
}

В 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
# {'id': 1, 'name': 'Ashutosh', 'books': ['Python', 'DSA'], 'college': 'NSEC'}
for key,value in dict_three.
items(): merged_dict[key] = value merged_dict # {'id': 1, 'name': 'Ashutosh', 'books': ['Python', 'DSA'], 'college': 'NSEC', 'city': 'Kolkata', 'country': 'India'}

Но проблема данного метода в том, что нам приходится запускать такой цикл для объединения словарей множество раз. Если нам просто нужно объединить два словаря, то это не будет проблемой. Но если у нас уже три словаря, то код становится громоздким. Что уж говорить о случаях, когда у нас больше трех словарей!

Очевидно, что данный метод не соответствует одному из главных принципов написания кода в Python – DRY (Don’t repeat yourself – не повторяйся). Поэтому данный цикл for можно, к примеру, поместить в функцию, и тогда код станет явно чище. Однако всё-таки это слишком замороченный способ для такой простой задачи, как объединение словарей. Поэтому стоит поискать уже готовые, встроенные в Python решения.

Итак, какой у нас есть еще вариант?

[python_ad_block]

Как объединить словари в 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
# {'id': 1, 'name': 'Ashutosh', 'books': ['Python', 'DSA'], 'college': 'NSEC', 'city': 'Kolkata', 'country': 'India'}

Но с использованием метода 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
#{'id': 1, 'name': 'Ashutosh', 'books': ['Python', 'DSA'], 'college': 'NSEC'}
dict_one.update(dict_three)
dict_one
#{'id': 1, 'name': 'Ashutosh', 'books': ['Python', 'DSA'], 'college': 'NSEC', 'city': 'Kolkata', 'country': 'India'}

Давайте рассмотрим другие варианты.

Как объединить словари в 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
#{'id': 1, 'name': 'Ashutosh', 'books': ['Python', 'DSA'], 'college': 'NSEC', 'city': 'Kolkata', 'country': 'India'}

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

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

Этот способ, однозначно, превосходит первые два и хорош в использовании. Но давайте рассмотрим ещё один.

Как объединить словари в 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
#{'id': 1, 'name': 'Ashutosh', 'books': ['Python', 'DSA'], 'college': 'NSEC', 'city': 'Kolkata', 'country': 'India'}

Это наиболее удобный способ объединения словарей в Python. Это простое и элегантное решение, которое стоит взять на заметку и использовать. Единственное, что стоит учитывать – это версию Python, которая установлена на ваш компьютер. Советуем обновить Python до последней версии и использовать все дополнительные «плюшки». Подробнее про улучшение Python в версии 3.9 можно почитать здесь.

Заключение

Таким образом, мы исследовали несколько различных методов объединения словарей. Если у вас Python 3.9 или выше, следует использовать оператор|. Но если вы по какой-то причине используете более старые версии Python и не хотите переходить на версию 3.9 и выше, вы можете использовать другие методы. Конечно, в таком случае лучше всего подойдет метод двойной звездочки **. Однако в некоторых случаях можно использовать и цикл for, и метод update().

Одним словом, выбирайте то, что вам больше по душе! Надеемся, что данная статья была вам полезна! Успехов в написании кода!

Перевод статьи «How to Merge Dictionaries in Python».

python — Добавить значения из двух словарей

спросил

Изменено 7 месяцев назад

Просмотрено 19 тысяч раз

 dict1 = {а: 5, б: 7}
dict2 = {а: 3, с: 1}
результат {а:8, б:7, в:1}
 

Как я могу получить результат?

  • питон
  • python-3.x
  • алгоритм
  • словарь
  • слияние
1

это однострочник, который сделает именно это:

 dict1 = {'a': 5, 'b': 7}
dict2 = {'а': 3, 'с': 1}
результат = {ключ: dict1.get(ключ, 0) + dict2.get(ключ, 0)
          для ключа в наборе (dict1) | установить (dict2)}
# {'с': 1, 'б': 7, 'а': 8}
 

обратите внимание, что set(dict1) | set(dict2) — это набор ключей обоих ваших словарей. и dict1.get(key, 0) возвращает dict1[key] , если ключ существует, 0 в противном случае.


это работает в более поздней версии Python:

 {k: dict1.get(k, 0) + dict2.get(k, 0) для k в dict1.keys() | dict2.keys()}
 
0

Вы можете использовать collections.Counter который реализует сложение + таким образом:

 >>> from collections import Counter
>>> dict1 = Counter({'a': 5, 'b': 7})
>>> dict2 = Counter({'a': 3, 'c': 1})
>>> Дикт1 + Дикт2
Счетчик({'a': 8, 'b': 7, 'c': 1})
 

, если вы действительно хотите получить результат в виде dict, вы можете вернуть его обратно:

 >>> dict(dict1 + dict2)
{'а': 8, 'б': 7, 'в': 1}
 
2

Вот вам хорошая функция:

 def merge_dictionaries(dict1, dict2):
    слитный_словарь = {}
    для ключа в dict1:
        если ключ в dict2:
            новое_значение = dict1 [ключ] + dict2 [ключ]
        еще:
            новое_значение = dict1[ключ]
        слитный_словарь[ключ] = новое_значение
    для ключа в dict2:
        если ключ не в merged_dictionary:
            слитный_словарь[ключ] = dict2[ключ]
    вернуть слитный_словарь
 

написав:

 dict1 = {'a': 5, 'b': 7}
dict2 = {'а': 3, 'с': 1}
результат = слияние_словари (dict1, dict2)
 

результат будет:

 {'a': 8, 'b': 7, 'c': 1}
 

Быстрое понимание словаря, которое должно работать на любых классах, которые принимают оператор +. Производительность может быть не оптимальной.

 {
    **дикт1,
    **{ k:(dict1[k]+v, если k в dict1, иначе v)
        для k,v в dict2.items() }
}
 
 Вот еще один подход, но он довольно длинный!
d1 = {'а': 5, 'б': 7}
d2 = {'а': 3, 'с': 1}
д = {}
для i,j в d1.items():
    для k,l в d2.items():
        если я==к:
            с={я:j+l}
            г. обновление (с)
для i,j в d1.items():
    если я не в d:
        д.обновление({i:j})
для m,n в d2.items():
    если m не в d:
        д.обновление({м:п})
 

Думаю, все намного проще.

 а={'а':3, 'б':5}
б = {'а': 4, 'б': 7}
{i:a[i]+b[i] для i в a.keys()}
 

Вывод: {'a': 7, 'b': 12}

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

8 стандартных методов (с кодом)

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

Но перед этим давайте кратко рассмотрим словари на питоне ниже.

Что такое словарь в Python?

Словарь представляет собой неупорядоченный набор элементов данных, хранящихся в парах ключ-значение , , в отличие от любой другой структуры данных, содержащей данные как один элемент значения. Вы можете создать словарь, поместив пару ключ-значение в фигурные скобки ({}), разделенные запятой (,).

Кроме того, элементы ключа и значения разделяются точкой с запятой (:). Словарь в питоне упорядочен, изменяем и не допускает дублирования. Это означает, что в словаре не может быть двух элементов с одним и тем же ключом; следовательно, ключи словаря неизменны.

Пример:

 sample_dict = {
  "Язык_1": "Питон",
  "Язык_2": "С++",
  «Язык_3»: «Ява»
}
печать (sample_dict)
 

 

Вывод:

 {'Язык_1': 'Python', 'Язык_2': 'C++', 'Язык_3': 'Java'}
 

 

Узнайте, как создать словарь Python, чтобы узнать больше.

Когда нужно объединять словари?

Словари используются для хранения пар ключ-значение. Они могут оказаться исключительно полезными для хранения данных, которые должны быть проиндексированы. Например, если вам нужно вести учет всех паролей, используемых на устройстве, вы должны реализовать словарь, который отслеживает все различные значения паролей для соответствующих ключей всех приложений, для которых они используются.

Но что происходит, когда вам нужно объединить записи паролей двух или более ваших устройств? Это та ситуация, когда нам это нужно. Мы объединяем два словаря, когда нам нужно хранить две разные части общей базы данных.

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

Ниже приведены 8 уникальных методов, с помощью которых вы можете объединить два словаря в Python:

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

Вы можете объединить два словаря в Python, используя метод update(). При использовании метода обновления первый словарь объединяется с другим путем его перезаписи. Следовательно, новый словарь не создается , и возвращается None. Если оба словаря содержат один и тот же ключ и разные значения, то окончательный вывод перезапишет значение последнего словаря.

Пример:

 dict_1 = {'Джон': 15, 'Рик': 10, 'Миса': 12}
dict_2 = {'Бонни': 18,'Рик': 20,'Мэтт': 16}
dict_1.обновление(dict_2)
print('Обновленный словарь:')
печать (дикт_1)
 

 

Вывод:

 {'Джон': 15, 'Рик': 20, 'Миса': 12, 'Бонни': 18, 'Мэтт': 16}
 

 

2) Использование оператора слияния (|)

Вы можете объединить два словаря, используя | оператор. Это очень удобный способ объединения словарей; однако он используется только в версии python 3.9 или выше.

Пример:

 def Merge(dict_1, dict_2):
результат = dict_1 | дикт_2
вернуть результат

# Код драйвера
dict_1 = {'Джон': 15, 'Рик': 10, 'Миса': 12}
dict_2 = {'Бонни': 18,'Рик': 20,'Мэтт': 16}
dict_3 = объединить (dict_1, dict_2)
печать (dict_3)
 

 

Вывод:

 {'Джон': 15, 'Рик': 20, 'Миса': 12, 'Бонни': 18, 'Мэтт': 16}
 

 

3) Использование оператора **

Самый простой способ объединить два словаря в Python — использовать оператор распаковки (**). Применяя оператор «**» к словарю, он расширяет его содержимое за счет набора пар «ключ-значение».

Например, если вы примените «**» к dict_1, как показано ниже, на выходе будут собраны пары ключ-значение, хранящиеся внутри dict_1.

Пример:

 dict_1 = {'Джон': 15, 'Рик': 10, 'Миса': 12}
печать (дикт (** дикт_1))
 

 

Вывод:

 {'Джон': 15, 'Рик': 10, 'Миса': 12}
 

 

Теперь, чтобы объединить два словаря с помощью «**», мы будем использовать дополнительный словарь для хранения окончательного вывода. Содержимое dict_1 и dict_2 будет расширено с помощью оператора «**» и объединено в dict_3.

Аналогично методу обновления, если оба словаря имеют один и тот же ключ с разными значениями, то окончательный вывод будет содержать значение второго словаря. Взгляните на приведенный ниже пример, чтобы понять работу оператора «**».

Пример:

 dict_1 = {'Джон': 15, 'Рик': 10, 'Миса': 12 }
dict_2 = {'Бонни': 18,'Рик': 20,'Мэтт': 16}
дикт_3 = {**дикт_1,**дикт_2}
печать (dict_3)
 

 

Вывод:

 {'Джон': 15, 'Рик': 20, 'Миса': 12, 'Бонни': 18, 'Мэтт': 16}
 

 

Вы также можете объединить три словаря одновременно, используя оператор «**», как показано в примере ниже.

Пример:

 dict_1 = {'Джон': 15, 'Рик': 10, 'Миса': 12}
dict_2 = {'Бонни': 18,'Рик': 20,'Мэтт': 16}
dict_3 = {'Стефан': 19, 'Рия': 14, 'Лора': 17}
дикт_4 = {**дикт_1,**дикт_2, **дикт_3}
печать (dict_4)
 

 

Вывод:

 {'Джон': 15, 'Рик': 20, 'Миса': 12, 'Бонни': 18, 'Мэтт': 16, 'Стефан': 19, 'Рия': 14 , «Лора»: 17}
 

 

4) Распаковка второго словаря

Распаковка второго словаря с использованием оператора «**» поможет вам объединить два словаря и получить окончательный результат. Однако этот метод не очень часто используется и рекомендуется, поскольку он будет работать только в том случае, если ключи второго словаря являются обязательными строками. Если встречается какое-либо значение int, оно вызывает метод «TypeError».

Пример:

 dict_1={'Джон': 15, 'Рик': 10, 'Миса' : 12 }
dict_2={'Бонни': 18,'Рик': 20,'Мэтт': 16}
dict_3 = dict (dict_1, ** dict_2)
печать (dict_3)
 

 

Вывод:

 {'Джон': 15, 'Рик': 20, 'Миса': 12, 'Бонни': 18, 'Мэтт': 16}
 

 

5) Использование метода collection.ChainMap()

Это один из наименее известных методов объединения двух словарей в Python. Используя метод collection.ChainMap(), вы должны использовать модуль collection из библиотеки ChainMap, который поможет вам сгруппировать несколько словарей в одном представлении.

Если оба словаря содержат один и тот же ключ/ключи, то в окончательном выводе извлекается значение первого словаря. Обратите внимание, что мы будем использовать синтаксис «import..from..» для импорта модуля коллекции, как показано в следующем примере:

Пример:

 from collections import ChainMap
dict_1={'Джон': 15, 'Рик': 10, 'Миса': 12 }
dict_2={'Бонни': 18,'Рик': 20,'Мэтт': 16}
dict_3 = Цепная карта (dict_1, dict_2)
печать (dict_3)
печать (дикт (дикт_3))
 

 

Вывод:

 ChainMap({'Джон': 15, 'Рик': 10, 'Миса': 12}, {'Бонни': 18, 'Рик': 20, 'Мэтт': 16})
{'Бонни': 18, 'Рик': 10, 'Мэтт': 16, 'Джон': 15, 'Миса': 12}
 

 

6) Использование itertools.chain()

Итератор возвращает элемент из первой итерации, пока он не станет пустым, а затем переходит к следующей итерации. По сути, он будет обрабатывать последовательную последовательность как одну последовательность.

Поскольку словарь также является итерируемым, мы можем использовать функцию chain() из класса itertools и объединить два словаря. Тип возврата этого метода будет объектом , и, следовательно, мы можем преобразовать словарь с помощью конструктора dict().

Пример:

 импорт itertools
dict_1={'Джон': 15, 'Рик': 10, 'Миса': 12}
dict_2={'Бонни': 18, 'Рик': 20, 'Мэтт': 16}
dict_3 = itertools.chain (dict_1.items(), dict_2.items())
#Возвращает объект итератора
печать (dict_3)
печать (дикт (дикт_3))
 

 

Вывод:

 <объект itertools.chain по адресу 0x000001EB8E312520>
{'Джон': 15, 'Рик': 20, 'Миса': 12, 'Бонни': 18, 'Мэтт': 16}
 

 

7) Использование словарного понимания

Мы можем объединить два словаря в Python, используя словарное понимание. Здесь мы также используем цикл for для перебора элементов словаря и их слияния для получения окончательного результата. Если оба словаря имеют общие ключи, то окончательный вывод с использованием этого метода будет содержать значение второго словаря.

Пример:

 dict_1={'Джон': 15, 'Рик': 10, 'Миса': 12}
dict_2={'Бонни': 18, 'Рик': 20, 'Мэтт': 16}
dict_3={k:v для d в (dict_1,dict_2) для k,v в d.items()}
печать (dict_3)
 

 

Вывод:

 {'Джон': 15, 'Рик': 20, 'Миса': 12, 'Бонни': 18, 'Мэтт': 16}
 

 

8) Добавить значения общих ключей

Во всех вышеперечисленных методах, если оба словаря содержат разные значения данных одних и тех же ключей, значения в конечном выводе переопределяются. Что делать, если вы хотите сохранить все значение в конечном выводе? Для этой цели вы можете объединить словари, чтобы добавить значения общих ключей в список и вернуть окончательный результат.

В этом методе мы также будем использовать цикл for для обхода ключей и значений в словаре внутри функции. Позже мы вызовем функцию, чтобы получить окончательный результат в виде объединенных словарей, как показано ниже:

Пример:

 dict_1 = {'John': 15, 'Rick': 10, 'Misa': 12}
dict_2 = {'Бонни': 18, 'Рик': 20, 'Мэтт': 16}  определение словаря слияния (dict_1, dict_2):
 дикт_3 = {**дикт_1, **дикт_2}
 для ключа, значение в dict_3.