Как уже упоминался в комментариях, которые необходимо перебрать все словари первого, чтобы собрать все ключи, в противном случае нет никакого способа узнать, какие ключи отсутствуют каждый отдельный Dict. Затем вы можете построить merged_dict
с пониманием dict.
import numpy as np
dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'b': 3, 'c': 4}
dict3 = {'c': 4, 'd': 4}
all_dicts = (dict1, dict2, dict3)
keys = {k for d in all_dicts for k in d}
merged_dict = {k: [d.get(k, np.nan) for d in all_dicts] for k in keys}
print(merged_dict)
выход
{'a': [1, nan, nan], 'b': [2, 3, nan], 'c': [3, 4, 4], 'd': [nan, nan, 4]}
Вы могли поставить множество понимание внутри Dict понимания, но я думаю, что делает код труднее читать.
merged_dict = {k: [d.get(k, np.nan) for d in all_dicts]
for k in {k for d in all_dicts for k in d}}
На самом деле, что двойные for
петли в множестве комп не столь эффективным. Это, вероятно, не имеет большого значения для малых dicts, но если dicts велики, что было бы более эффективным, чтобы сделать одну из этих петель при скорости С помощью set.update
метода:
keys = set()
for d in all_dicts:
keys.update(d.keys())
Это, вероятно, еще лучше:
keys = set().union(*all_dicts)
Thanks, Dan. D за это предложение!
Вот еще один способ, с помощью itertools
:
from itertools import chain
keys = set(chain.from_iterable(dicts))
Почему 4 ключа d приходят после других элементов в списке? – PeteyPii
, потому что он не существует в первых двух словарях – Chris
Думаю, вы просто укусили пулю и перебрали словари и ключи. У вас может быть только итерация, чтобы собрать все ключи. – hpaulj