2012-10-03 289 views
1

我有一个字典,并希望与另外3个字典进行比较。 如果密钥不存在于任何3个字典中,则使用该密钥创建一个新的字典,值对,同样,如果密钥和值都匹配3个字母中的任何一个,并且如果密钥存在但值为不同然后再创建一个字典。python多个字典比较

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后创建2个字典,这会使进程复杂化。有没有人有更好的主意?

+4

@PaulC:为什么要使用一个URL缩短如果新网址超出原来的? –

+0

很好的问题。我认为,因为它看起来不错。我刚刚从我打开的另一个标签复制它。没有特别的理由使用它。我会在下次使用“正常”的! –

+0

@Tim,我已经更新了正确的格式,但你已经知道了。 – user922898

回答

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

实际上,'items()'和'iteritems()'都能在2.7中工作。由于他们没有字典理解,因此它们都不能在早期版本中使用。 – Junuxx

+0

谢谢蒂姆。我使用b.update(c)和b.update(d),所以现在我只需要使用a和b来进行比较。 – user922898

+0

@Junuxx:谢谢;我已经澄清了我的答案(我希望):) –

2

这里的(不使用字典理解)解决方案基于添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'}