我有一个字典,想再比较3个字典。如果 3 个字典中的任何一个中都不存在键,则要使用该键、值对创建一个新字典,此外,如果键和值在 3 个字典中的任何一个中都匹配,则跳过,如果键存在但值不同,则再创建一个字典。
a={'a':1,'b':2,'c':3,'d':4}
b={'a':10,'b':20}
c={'p':100,'q':200,'c':300}
d={'a':1000,'x':2000,'c':3}
在将字典 a 与 b、c 和 d 进行比较后。结果应该是p_dict = {'d':4}
和q_dict = {'a':1,'b':2}
我正在考虑多个 for 循环,但在比较字典 a 和 b 后,它会再创建 2 个字典,这将使过程复杂化。有人有更好的主意吗?
这是Python 3.3的解决方案。这也适用于 Python 2.7,但在那里我会使用 .iteritems()
而不是 .items()
:
>>> a = {"a":1, "b":2, "c":3, "d":4}
>>> b = {"a":10, "b":20}
>>> c = {"p":100, "q":200, "c":300}
>>> d = {"a":1000, "x":2000, "c":3}
>>> p_dict = {k:v for k,v in a.items()
... if not any(k in dicts for dicts in (b,c,d))}
>>> p_dict
{'d': 4}
>>> q_dict = {k:v for k,v in a.items()
... if any(k in dicts for dicts in (b,c,d))
... and not any(dicts.get(k)==v for dicts in (b,c,d))}
>>> q_dict
{'a': 1, 'b': 2}
这假设字典中的所有值都不是None
的。
这是一个基于Tim Pietzcer方法的2.x(不使用字典理解)解决方案:
In [680]: dicts=[b,c,d]
In [681]: p_dict=dict([(k,v) for k,v in a.iteritems()
if not any(k in di for di in dicts)])
In [682]: p_dict
Out[682]: {'d': '4'}
In [683]: q_dict=dict([(k,v) for k,v in a.iteritems()
if any(k in di for di in dicts)
and not any(di.get(k)==v for di in dicts) ])
In [684]: q_dict
Out[684]: {'a': '1', 'b': '2'}