Python: обобщение списка словарей с разными ключами и одинаковыми значениями - PullRequest
0 голосов
/ 27 марта 2019

У меня есть следующий список словарей с различными ключами и значениями. Каждый словарь имеет только одну пару ключ-значение.

[{'a':1}, {'b':1}, {'a':1}, {'b':2}]

Мне нужен следующий вывод, предпочтительно с использованием списка / диктов

[{'a': 2, 'b': 3}]

Я посмотрел на похожий вопрос , но мне не повезло с этим разобраться. Любые предложения, пожалуйста?

Ответы [ 3 ]

4 голосов
/ 27 марта 2019

вы можете использовать collections.Counter:

from collections import Counter

lst = [{'a':1}, {'b':1}, {'a':1}, {'b':2}]

c = Counter()

for dct in lst: 
    c.update(dct)

print(c)
# Counter({'b': 3, 'a': 2})
4 голосов
/ 27 марта 2019

В ответе на вопрос, на который вы ссылаетесь, есть ответ:

dict1 = [{'a':1}, {'b':1}, {'a':1}, {'b':2}]

final = {}
for d in dict1:
    for k in d.keys():
        final[k] = final.get(k,0) + d[k]

print (final)

Урожайность:

{'a': 2, 'b': 3}
2 голосов
/ 27 марта 2019

Это можно сделать в одной строке без какого-либо импорта, используя некоторое умное сокращение

Чтобы понять, как это работает, вы должны понять, как работает Reduce . По сути, это позволяет вам определить операцию, которая берет два элемента из списка и сводит их к одному элементу. Затем он рекурсивно применяет эту операцию к вашему списку, пока список не будет уменьшен до одного элемента. Вот однострочная версия:

dict1 = [{'a':1}, {'b':1}, {'a':1}, {'b':2}]

print(reduce(lambda a, b: {k: a.setdefault(k, 0) + b.setdefault(k, 0) for k in set(a.keys()).union(b.keys())}, dict1))

В этом случае операция определяется как:

lambda a, b: 
        {k: a.setdefault(k, 0) + b.setdefault(k, 0) for k in (set(a.keys()).union(b.keys()))}

Что также можно выразить как:

# a and b are two elements from the list. In this case they are dictionaries
def combine_dicts(a, b):
    output = {}
    for k in set(a.keys()).union(b.keys()): # the union of the keys in a and b
        output[k] = a.setdefault(k, 0) + b.setdefault(k, 0)
        # dict.setdefault returns the provided value if the key doesn't exist
    return output

Когда эта операция применяется к вашему списку с помощью Reduce, вы получите желаемый результат:

>>> {'b': 3, 'a': 2}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...