2017-12-18 742 views
3

我有兩個字典與相同的鍵相同。 第字典是:在Python中使用相同的鍵合併兩個字典

{ "key_1" : "AR" , 
    "key_2":"BR" , 
    "key_3" : "CR" } 

第二個是:

{ "key_1" : "signinfication of AR" , 
    "key_2":" signinfication of BR" , 
    "key_3" : " signinfication of CR" } 

,我希望獲得下面的詞典:

{"key_1" : {"AR" : "signinfication of AR"} , 
"key_2" : {"BR" : "signinfication of BR"} , 
"key_3" : {"CR" : "signinfication of CR"} 

謝謝您的幫助!

回答

9

這就像一條線一樣簡單字典理解

>>> {k : {d1[k] : d2[k]} for k in d1.keys() & d2.keys()} 
{ 
    "key_2": { 
     "BR": " signinfication of BR" 
    }, 
    "key_1": { 
     "AR": "signinfication of AR" 
    }, 
    "key_3": { 
     "CR": " signinfication of CR" 
    } 
} 

這裏,d1d2是你的兩個庫。 d1.keys() & d2.keys()將在字典鍵上執行交集,以確保對字典中存在的鍵進行迭代。在這裏,這是

d1.keys() & d2.keys() 
{'key_1', 'key_2', 'key_3'} 

這是很好的一般意義上,當你不能保證兩個字典有完全相同的鍵。


在python2.7及更高版本上,您需要稍作修改,因爲keys()會返回一個列表。使用set.intersection -

>>> {k : {d1[k] : d2[k]} for k in set(d1.keys()).intersection(d2.keys())} 

如果你處理列表的類型的字典工作,那麼上面的代碼需要相應的列表之間的zip平 -

>>> d1 
{ 
    "key_1": [ 
     "AR", 
     "BR", 
     "CR" 
    ], 
    ... 
}  
>>> d2 
{ 
    "key_1": [ 
     "signfication of AR", 
     "signfication of BR", 
     "signfication of CR" 
    ], 
    ... 
} 
>>> {k : dict(zip(d1[k], d2[k])) for k in d1.keys() & d2.keys()} 
{ 
    "key_1": { 
     "BR": "signfication of BR", 
     "CR": "signfication of CR", 
     "AR": "signfication of AR" 
    }, 
    "key_3": { 
     "CE": " signfication of CE", 
     "AE": "signfication of AE", 
     "BE": " signfication of BE" 
    }, 
    "key_2": { 
     "BZ": "signfication of BZ", 
     "CZ": "signfication of CZ", 
     "AZ": "signfication of AZ" 
    } 
} 
2

你也可以zip()在一起的詞典items(),並將它們合併在一起:

d1 = {"key_1" : "AR", 
     "key_2":"BR", 
     "key_3" : "CR"} 

d2 = {"key_1" : "signinfication of AR", 
     "key_2":" signinfication of BR", 
     "key_3" : " signinfication of CR"} 

# make sure both lists have same ordered keys 
l1 = sorted(d1.items()) 
l2 = sorted(d2.items()) 

d = {k1 : {v1:v2} for (k1, v1), (_, v2) in zip(l1, l2)} 

print(d) 

,輸出:

{'key_1': {'AR': 'signinfication of AR'}, 
'key_2': {'BR': ' signinfication of BR'}, 
'key_3': {'CR': ' signinfication of CR'}} 

編輯:

正如@cᴏʟᴅsᴘᴇᴇᴅ建議,你可以調用列表sorted荏苒他們,這確保了兩個字典具有相同的順序前:key_1key_2,key_3。您還可以對密鑰進行初步檢查,例如檢查它們的交集,以確保兩個字典具有相同的密鑰。

+1

你能保證密鑰從兩個類型的字典以相同的順序返回? –

+0

@cᴏʟᴅsᴘᴇᴇᴅ嗯我沒有想到,對不起。我想OP可以在你的回答中使用你的建議,以確保這種情況發生。無論如何,我會添加這個,謝謝。 – RoadRunner

+2

保證這不是什麼大事,只要調用'sorted'並且它應該工作。 Upvoted,歡呼聲。 –

1

你可以試試這個:

s = { "key_1" : "AR" , 
"key_2":"BR" , 
"key_3" : "CR" } 

d = { "key_1" : "signinfication of AR" , 
"key_2":" signinfication of BR" , 
"key_3" : " signinfication of CR" } 
new_d = {a:{b:d[a]} for a, b in s.items()} 

輸出:

{'key_1': {'AR': 'signinfication of AR'}, 'key_3': {'CR': ' signinfication of CR'}, 'key_2': {'BR': ' signinfication of BR'}}