将词典合并到列表字典中

时间:2016-11-27 06:25:40

标签: python numpy dictionary merge

我有三本词典:

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]}

某些字典中有一些键而不是其他字典,这使得循环很麻烦。想知道最干净的方法是什么。

3 个答案:

答案 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

enter image description here

获取您要找的词典。

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}