例如,我有两个词组。
A = {'a':1, 'b':10, 'c':2}
B = {'b':3, 'c':4, 'd':10}
我想要一个这样的结果:
{'a':1, 'b': [10, 3], 'c':[2, 4], 'd':10}
如果两个词都出现了一个键,我想列出这两个值。
答案 0 :(得分:4)
我将所有值列表:
{k: filter(None, [A.get(k), B.get(k)]) for k in A.viewkeys() | B}
演示:
>>> 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)
如果您不想要重复值