我有三本词典:
dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'b': 3, 'c': 4}
dict3 = {'c': 4, 'd': 4}
我想'合并'他们进入列表词典
merged_dict = {'a':[1, np.nan, np.nan],
'b':[2, 3, np.nan],
'c':[3, 4, 4],
'd':[np.nan, np.nan, 4]}
某些字典中有一些键而不是其他字典,这使得循环很麻烦。想知道最干净的方法是什么。
答案 0 :(得分:5)
如评论中所述,您需要首先遍历所有词典以收集所有键,否则无法知道每个词典中缺少哪些键。然后你可以用词典理解来构建merged_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}}
实际上,set comp中的双for
循环效率不高。对于小的dicts来说,它可能并不重要,但是如果dicts很大,使用set.update
方法以C速度执行其中一个循环会更有效:
keys = set()
for d in all_dicts:
keys.update(d.keys())
这可能更好:
keys = set().union(*all_dicts)
谢谢,丹。 D对于那个建议!
这是另一种方式,使用itertools
:
from itertools import chain
keys = set(chain.from_iterable(dicts))
答案 1 :(得分:3)
pandas
在解析词典和合并它们方面做得很好。你可以这样做。
设置
import pandas as pd
dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'b': 3, 'c': 4}
dict3 = {'c': 4, 'd': 4}
解决方案
df = pd.concat([pd.Series(d) for d in [dict1, dict2, dict3]], axis=1)
df
获取您要找的词典。
df.T.to_dict('list')
{'a': [1.0, nan, nan],
'b': [2.0, 3.0, nan],
'c': [3.0, 4.0, 4.0],
'd': [nan, nan, 4.0]}
答案 2 :(得分:2)
这应该这样做。
from itertools import chain
dicts = [dict1, dict2, dict3]
keys = set(chain(*[d.keys() for d in dicts]))
merged_dict = {k: [d.get(k, np.nan) for d in dicts] for k in keys}