defaultdict
Вы можете использовать collections.defaultdict
.Ваше понимание словаря никогда не будет работать, так как вы не определяете никаких списков.Это, вероятно, будет более эффективным, чем использование словарного понимания, которое будет включать итерацию каждого словаря для каждого уникального ключа.
from collections import defaultdict
dd = defaultdict(list)
for d in list_of_dictionaries:
for k, v in d.items():
dd[k].append(v)
Результат:
print(dd)
defaultdict(list,
{0: [3523, 7245],
1: [3524, 7246, 20898],
2: [3540, 7247, 20899],
4: [3541, 20901],
5: [3542, 7249, 20902],
3: [7248, 20900],
6: [7250]})
Понимание словаря
Понимание словаря возможно , но для этого требуется вычислить объединение ключей и выполнить итерацию списка словарей для каждого из этих ключей:
allkeys = set().union(*list_of_dictionaries)
res = {k: [d[k] for d in list_of_dictionaries if k in d] for k in allkeys}
{0: [3523, 7245],
1: [3524, 7246, 20898],
2: [3540, 7247, 20899],
3: [7248, 20900],
4: [3541, 20901],
5: [3542, 7249, 20902],
6: [7250]}
Сложность времени
Рассмотрим следующие термины:
n = sum(map(len, list_of_dictionaries))
m = len(set().union(*list_of_dictionaries))
k = len(list_of_dictionaries)
В этом контексте решение defaultdict
будет иметь сложность O ( n ), тогда как понимание словаря будет иметь сложность O ( mk *)1027 *), где мк > = n .