2013-10-21 62 views
1

嗨如果我想用共同的價值觀而不是僅僅更新它們,那該怎麼辦?比如讓說的值是一個字符串,我想提出一個簡單的標籤它們之間加入兩個詞典並處理它的共同價值

a={'car':'ferrari','color':'red','driver':'M'} 
b={'car':'lamborghini','color':'yellow','transmission':'manual'} 

這樣的結果是,

merge_ab={'car':'ferrari\tlamborghini','color':'red\tyellow','driver':'M\t','transmission':'\tmanual'} 
+5

那你試試這麼遠嗎? –

回答

1

試試這個,它會在Python 2.x的工作:

{ k:a.get(k, '') + '\t' + b.get(k, '') for k in set(a.keys() + b.keys()) } 

=> {'color': 'red\tyellow', 'car': 'ferrari\tlamborghini', 
    'driver': 'M\t', 'transmission': '\tmanual'} 

如果你想使用迭代器,在Python 2.x中做到這一點:

import itertools as it 
{k:a.get(k,'')+'\t'+b.get(k,'') for k in set(it.chain(a.iterkeys(),b.iterkeys()))} 

等價,爲此在Python 3.x:

{ k:a.get(k,'') + '\t' + b.get(k,'') for k in set(it.chain(a.keys(), b.keys())) } 
+1

你會失去所有不屬於'a'的項目。 – ThiefMaster

+0

@ThiefMaster你是對的,修好了! –

+0

這給出了他們想要的確切輸出,但是可以將條件縮短爲'dicA.get(k,'')'。 – georg

2

你可以先合併類型的字典,然後處理常見分別鍵:

merge_ab = dict(a, **b) 
for key in set(a) & set(b): 
    merge_ab[key] = '{0}\t{1}'.format(a[key], b[key]) 

如果您正在使用Python 2.7,你可以使用的set(a) & set(b)更有效a.viewkeys() & b.viewkeys()代替。

+0

ty,將它添加到我的答案中。 – ThiefMaster

+0

這似乎是所建議的方法中最快的,對於至少給出的輸入。 –

+0

謝謝你......我一定錯過了這個。讓我試試這個! – user2755526

0

是這樣的嗎?請注意,這會修改字典b,這可能不是您想要的;如果你想創建一個新的字典,那麼只需分配一個:c={ }並將項目排序。

>>> a={'car':'ferrari','color':'red','driver':'M'} 
>>> b={'car':'lamborghini','color':'yellow','transmission':'manual'} 
>>> for k, v in a.items() : # Iterate over all key, item pairs of the a dictionary. 
...  if k in b : # If a given key exists in the b dictionary as well, then... 
...   b[k] += "\\" + v # ...merge the two items. 
...  else : # Else, if the given key does not exist in the b dictionary, then... 
...   b[k] = v # ...add it. 
... 
>>> b 
{'color': 'yellow\\red', 'car': 'lamborghini\\ferrari', 'transmission': 'manual', 'driver': 'M'} 
3

這裏是一個不錯的Python化的方式來做到這一點:

dicts = [a, b] 
allKeys = set(k for d in dicts for k in d.iterkeys()) 
makeValue = lambda k: '\t'.join(d.get(k, '') for d in dicts) # Make merged value for a given key 
merged = dict((k,makeValue(k)) for k in allKeys) 
+1

這有一個好處,它可以合併兩個以上的字典 - 只需將它們添加到列表! – MangoHands