Python - 在两个dicts中查找非共同项

时间:2011-06-28 15:29:21

标签: python

假设我有两本词典:

a = {'a': 1, 'b': 2, 'c': 3}
b = {'b': 2, 'c': 3, 'd': 4, 'e': 5}

找到两者之间的非共同项目的最pythonic方式是什么,以便ab得到:

{'a': 1, 'd': 4, 'e': 5}

我原以为:

{key: b[key] for key in b if not a.get(key)}

但这只是一种方式(b项不在a中)和

a_only = {key: a[key] for key in a if not b.get(key)}.items()
b_only = {key: b[key] for key in b if not a.get(key)}.items()

dict(a_only + b_only)
接缝非常凌乱。还有其他解决方案吗?

4 个答案:

答案 0 :(得分:11)

>>> dict(set(a.iteritems()) ^ set(b.iteritems()))
{'a': 1, 'e': 5, 'd': 4}

答案 1 :(得分:3)

尝试使用set()的{​​{3}}:

out = {}
for key in set(a.keys()) ^ set(b.keys()):
   out[key] = a.get(key, b.get(key))

答案 2 :(得分:2)

diff = {key: a[key] for key in a if key not in b}
diff.update((key,b[key]) for key in b if key not in a)

只是你所拥有的更便宜的版本。

答案 3 :(得分:0)

>>> a = {'a': 1, 'b': 2, 'c': 3}
>>> b = {'b': 2, 'c': 3, 'd': 4, 'e': 5}
>>> keys = set(a.keys()).symmetric_difference(set(b.keys()))
>>> result = {}
>>> for k in keys: result[k] = a.get(k, b.get(k))
... 
>>> result
{'a': 1, 'e': 5, 'd': 4}

这是否比你的版本更糟糕是有争议的,但至少它不会重新实现symmetric_difference。