Почти похоже, но оно короткое, и мне нравится немного лучше.

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

Входные данные:

{'first':{'a': 5}, 'second':{'a': 10}, 'third':{'b': 5, 'c': 1}}

Выход:

{'a': 15, 'b': 5, 'c': 1}

Я сделал:

def merge_dicts(large_dictionary):
    result = {}
    for name, dictionary in large_dictionary.items():
        for key, value in dictionary.items():
            if key not in result:
                result[key] = value
            else:
                result[key] += value
    return result

Что работает, но я не думаю, что это такой хороший способ (или менее "питонический").

Кстати, мне не нравится название, которое я написал. Если кто-то думает о лучшей формулировке, пожалуйста, отредактируйте.

 Stefan Pochmann03 нояб. 2017 г., 19:05
Единственная плохая вещь, которую вы делаете, это переходитlarge_dictionary.items() вместоlarge_dictionary.values().

Ответы на вопрос(3)

но оно короткое, и мне нравится немного лучше.

def merge_dicts(large_dictionary):
    result = {}
    for d in large_dictionary.values():
        for key, value in d.items():
            result[key] = result.get(key, 0) + value
    return result

Это будет работать

from collections import defaultdict
values = defaultdict(int)
def combine(d, values):
    for k, v in d.items():
        values[k] += v

for v in a.values():
    combine(v, values)

print(dict(values))
 daemon2403 нояб. 2017 г., 20:27
Я не поместил список в defaultdict, я поместил результат defaultdict (lambda: 0), defaultdict (int) и defaultdict (lambda: 0) в один и тот же. Но int будет более питоническим, я тоже думал.
 Stefan Pochmann03 нояб. 2017 г., 20:47
@ Wim Да, ладно, я идиот ... не ожидалdef f(): return [] всегда возвращать один и тот же. Кое-что оdefaultdict(lambda: []) как-то меня скинул. Я думаю, потому что это выглядит слишком похоже на запись параметров по умолчанию.
 Stefan Pochmann03 нояб. 2017 г., 20:35
@ Wim Ох. Хм. Я думал, что он всегда будет возвращать один и тот же список. Но это не так. Должен подумать, когда у меня будет больше времени. Спасибо за исправление.
Решение Вопроса

Вы можете суммировать счетчики, которые являются подклассом dict:

>>> from collections import Counter
>>> sum(map(Counter, d.values()), Counter())
Counter({'a': 15, 'b': 5, 'c': 1})

Ваш ответ на вопрос