Используйте defaultdict
для автоматического создания словарной записи с пустым списком.
Чтобы обработать все исходные словари в цикле single , используйте itertools.chain
.
Основной цикл просто добавляет значение из текущего элемента в список под текущим ключом.
Как вы писали, для случаев, когда под каким-то ключом находится только один элемент, выдолжен генерировать рабочий словарь (используя диктонное понимание ), ограниченный элементами со значением (списком), содержащими только один элемент.Значение такого элемента должно содержать только первое (и единственное) число из списка источников.
Затем используйте этот словарь для обновления d
.
Так что весь скрипт может быть на удивление коротким, как показано ниже:
from collections import defaultdict
from itertools import chain
a = {'a':1, 'b': 2}
b = {'aa':4, 'b': 6}
c = {'aa':3, 'c': 8}
d = defaultdict(list)
for k, v in chain(a.items(), b.items(), c.items()):
d[k].append(v)
d.update({ k: v[0] for k, v in d.items() if len(v) == 1 })
Как видите, фактический код обработки содержится только в 4 (последних) строках.
Если вы напечатаете d
, результат будет:
defaultdict(list, {'a': 1, 'b': [2, 6], 'aa': [4, 3], 'c': 8})