2017-12-18 8 views
3

동일한 키가있는 두 개의 사전이 있습니다. 첫 번째 사전은 다음과 같습니다동일한 키를 사용하여 파이썬에서 두 개의 사전을 병합하십시오.

{ "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

이것은 한 줄만큼 간단합니다 dict 이해율입니다. 여기

>>> {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'} 

두 사전이 모두 똑같은 키를 가질 수 있다고 보장 할 수없는 경우 일반적인 의미로 사용하는 것이 좋습니다. keys()이 목록을 반환하기 때문에


python2.7에

세 이상, 당신은 약간의 수정이 필요 것입니다.

>>> 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

또한 수 -

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

당신이 목록의 dicts로 작업하는 경우, 위의 코드를 해당 목록 사이 zip 핑 (ping)을 필요로 - set.intersection 사용 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_1, key_2, key_3. 두 사전에 동일한 키가 있는지 확인하기 위해 키 확인 (예 : 교차 확인)을 할 수도 있습니다.

+1

당신이 키가 같은 순서로 모두 dicts에서 반환되는 것을 보장 할 수 있습니까? –

+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'}}