объединение двух списков словаря с добавленным значением одного и того же ключа и, если ключ не найден, добавляется значение - PullRequest
0 голосов
/ 11 апреля 2020

Счет

[{'A': 5, 'B': 10, 'C': 15}, {'A': 5, 'B': 25, 'C': 17, 'D': 30, }]

Банк

[{'A': 5, 'G': 10, 'Q': 15}, {'A': 5, 'B': 25, 'M': 17, 'T': 30, }]

После объединения

Ответ

[{'A':10,'B':10,'C':15,'G':10,'Q':15},{'A':10,'B':50,'C':17,'D':30,'M':17,'T':30}]

1 Ответ

1 голос
/ 11 апреля 2020

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

from collections import Counter

l1 = [{'A': 5, 'B': 10, 'C': 15}, {'A': 5, 'B': 25, 'C': 17, 'D': 30, }]

l2 = [{'A': 5, 'G': 10, 'Q': 15}, {'A': 5, 'B': 25, 'M': 17, 'T': 30, }]

result = [Counter(x) + Counter(y) for x, y in zip(l1, l2)]

print(result)

Выход:

[Counter({'C': 15, 'Q': 15, 'A': 10, 'B': 10, 'G': 10}), Counter({'B': 50, 'D': 30, 'T': 30, 'C': 17, 'M': 17, 'A': 10})]

Counter является подклассом dict, поэтому вы можете рассматривать его как обычный словарь. Вы можете привести его к dict, если хотите, чтобы ваш результат выглядел как [{'A': 10, 'B': 10, 'C': 15, 'G': 10, 'Q': 15}, {'A': 10, 'B': 50, 'C': 17, 'D': 30, 'M': 17, 'T': 30}].

Почему вышеприведенное работает из документов :

Несколько математических операций предоставлено для объединения объектов Counter для создания мультимножеств (счетчиков, число которых больше нуля). Сложение и вычитание объединяют счетчики путем сложения или вычитания количества соответствующих элементов. Пересечение и объединение возвращают минимум и максимум соответствующих отсчетов. Каждая операция может принимать входные данные со счетным числом, но выходные данные исключают результаты с нулевым или меньшим числом.

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