2013-07-24 3 views
0

회상 질문 제목에 사과드립니다. 그러나 여기에는 제가 의미하는 바가 있습니다. 파이썬에서 중첩 된 사전의 키 순서를 교환하는 효율적인 방법은 무엇입니까?

값에 InnerKey,OuterKey쌍 협회 보존되어 있지만, 순서는 단순히 반전 된 방법

newdictionary = {"InnerKey1" : {"OuterKey1" : "Value1", "OuterKey2" : "Value3"}, 
       "InnerKey2" : {"OuterKey1" : "Value2", "OuterKey2" : "Value4"}} 

통지에

mydictionary = {"OuterKey1": {"InnerKey1": "Value1", "InnerKey2": "Value2"}, 
       "OuterKey2": {"InnerKey1": "Value3", "InnerKey2": "Value4"}} 

변환. 이전에 Value1mydictionary[OuterKey][InnerKey]을 사용하여 액세스 한 경우 이제 newdictionary[InnerKey][OuterKey]을 사용하여 액세스합니다.

이를 달성하기위한 직접적인 방법은 첫 번째 사전을 통해 두 개의 중첩 루프를 다시 만들고 한 번에 두 번째 사전 하나의 요소를 작성하는 것입니다. 그러나 목록 작성과 같이 클리너/파이썬 적 방법이 더 많을지 궁금합니다.

업데이트 : 원하는 출력에 대해 혼란이있는 것 같습니다. 특히, 변환 후에 OuterKey가 매핑해야하는 값에 대한 혼동이 있습니다. 대답은 이전의 외부 키 (현재 내부 키)가에 매핑 된 이전 내부 키 (현재 외부 키)와 동일한 값으로 매핑되어야한다는 것입니다. 이처럼

+0

가'Value1'와'Value3'이 예상 출력에 같은 사전에 있어야하는데? 당신은 어디서나 그것을 설명하는 것 같지 않습니다. – TerryA

+0

동일한 키 쌍이 항상 같은 값을 리턴해야합니다. 그래서 mydictionary [key1] [key2] == newdictionary [key2] [key1]' – Luke

답변

7

훨씬 더 읽기 후 이해. 결국, "가독성 ... 계산"

mydictionary = {"OuterKey1": {"InnerKey1": "Value1", "InnerKey2": "Value2"}, "OuterKey2": {"InnerKey1": "Value3", "InnerKey2": "Value4"}} 
d = {} 
for k, v in mydictionary.items(): 
    for ik, iv in v.items(): 
      d.setdefault(ik, {})[k] = iv 

# result: 
# d == {'InnerKey2': {'OuterKey2': 'Value4', 'OuterKey1': 'Value2'}, 'InnerKey1': {'OuterKey2': 'Value3', 'OuterKey1': 'Value1'}} 

같은 defaultdict 사용 :

from collections import defaultdict 
d = defaultdict(dict) 
for k, v in mydictionary.items(): 
    for ik, iv in v.items(): 
      d[ik][k] = iv 
+0

멋진 솔루션입니다. 하지만 왜 defaultdict를 사용하지 않았습니까? –

+0

Python 2.4와 호환되어야하는 기존 코드 작성 습관 ...하지만 defaultdict를 사용하여 예제를 추가 할 것입니다. – mata

1

: 루프 (또는 defaultdict)에서 나는 setdefault를 사용하여 찾을이 경우

>>> mydictionary = {"OuterKey1": {"InnerKey1": "Value1", "InnerKey2": "Value2"}, 
...     "OuterKey2": {"InnerKey1": "Value3", "InnerKey2": "Value4"}} 
>>> dict([(k, dict([(k2,mydictionary[k2][k]) for k2 in mydictionary])) 
...  for k in mydictionary.values()[0]]) 
{'InnerKey2': {'OuterKey2': 'Value4', 'OuterKey1': 'Value2'}, 
'InnerKey1': {'OuterKey2': 'Value3', 'OuterKey1': 'Value1'}} 
+0

이것은 내가 원하는 해결책의 유형입니다 그것을보기를 제외하고는 (내 잘못으로 인해) 모든 내부 키가 모든 (특히 첫 번째) 외부 사전에 나타납니다. – merlin2011

+0

이 경우 마타의 대답이 올바른 접근법입니다. – Luke

관련 문제