python多个字典比较

时间:2012-10-03 16:41:40

标签: python dictionary compare

我有一个词典,想要与另外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并且它会使进程复杂化。有没有人有更好的想法?

2 个答案:

答案 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'}