2012-10-03 547 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'}