是否有任何pythonic方法来组合两个dicts(列出常用值列表)?

时间:2014-04-06 09:34:07

标签: python python-2.7 dictionary

例如,我有两个词组。

A = {'a':1, 'b':10, 'c':2}
B = {'b':3, 'c':4, 'd':10}

我想要一个这样的结果:

{'a':1, 'b': [10, 3], 'c':[2, 4], 'd':10}

如果两个词都出现了一个键,我想列出这两个值。

2 个答案:

答案 0 :(得分:4)

我将所有值列表:

{k: filter(None, [A.get(k), B.get(k)]) for k in A.viewkeys() | B}

使用dictionary view objects

演示:

>>> A = {'a':1, 'b':10, 'c':2}
>>> B = {'b':3, 'c':4, 'd':10}
>>> {k: filter(None, [A.get(k), B.get(k)]) for k in A.viewkeys() | B}
{'a': [1], 'c': [2, 4], 'b': [10, 3], 'd': [10]}

这至少可以使您的价值类型保持一致。

要生成输出,您需要使用两个词典之间的集合交集和对称差异:

dict({k: [A[k], B[k]] for k in A.viewkeys() & B},
     **{k: A.get(k, B.get(k)) for k in A.viewkeys() ^ B})

演示:

>>> dict({k: [A[k], B[k]] for k in A.viewkeys() & B},
...      **{k: A.get(k, B.get(k)) for k in A.viewkeys() ^ B})
{'a': 1, 'c': [2, 4], 'b': [10, 3], 'd': 10}

在Python 3中,dict.keys()是一个字典视图,因此您只需用.viewkeys()替换所有.keys()次调用即可获得相同的功能。

答案 1 :(得分:3)

我会想到Martijn Pieters的概念,你可能想要对结果字典中的所有值使用相同的类型。

提供第二种选择:

您还可以使用defaultdict直观地获得结果。

defaultdict就像一个dict,但它有一个默认构造函数,如果该键尚不存在则会被调用。

所以你会去:

from collections import defaultdict

A = {'a':1, 'b':10, 'c':2}
B = {'b':3, 'c':4, 'd':10}

result = defaultdict(list)

for d in [A, B]:
    for k, v in d.items():
        result[k].append(v)

然后在稍后阶段,您仍然可以轻松地为结果添加更多值。

你也可以切换到

defaultdict(set)

如果您不想要重复值