我有一个词典,想要与另外3个词典进行比较。 如果在3个dict中的任何一个中都不存在key,那么用该键,值对创建一个新的dict,如果键和值都在3个dict中的任何一个中匹配,并且如果key存在但值不同则跳过然后再创造一个词典。
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}
将dict a与b,c和d进行比较。结果应为p_dict = {'d':4}
和q_dict = {'a':1,'b':2}
我正在考虑使用多个for循环但是在比较dict a和b之后它会创建另外两个dict并且它会使进程复杂化。有没有人有更好的想法?
答案 0 :(得分: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
。
答案 1 :(得分:2)
这是基于Tim Pietzcer方法的2.x(不使用dict理解)解决方案:
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'}