다음과 같은 사전이 주어집니다.
my_map = {'a': 1, 'b': 2}
이지도를 뒤집어 어떻게 얻을 수 있습니까?
inv_map = {1: 'a', 2: 'b'}
답변
Python 2.7.x의 경우
inv_map = {v: k for k, v in my_map.iteritems()}
Python 3+의 경우 :
inv_map = {v: k for k, v in my_map.items()}
답변
dict의 값이 고유하다고 가정하면 :
dict((v, k) for k, v in my_map.iteritems())
답변
의 값 my_map
이 고유하지 않은 경우 :
inv_map = {}
for k, v in my_map.iteritems():
inv_map[v] = inv_map.get(v, [])
inv_map[v].append(k)
답변
맵핑 유형을 유지하면서 ( dict
또는 dict
서브 클래스 인 경우) 이를 수행하려면 다음을 수행하십시오 .
def inverse_mapping(f):
return f.__class__(map(reversed, f.items()))
답변
이 시도:
inv_map = dict(zip(my_map.values(), my_map.keys()))
(참고 사전 뷰에 대한 파이썬 문서가 있음을 명시 적으로 보장 .keys()
하고 .values()
작업에 대한 위의 접근을 허용하는 동일한 순서로, 자신의 요소를 가지고있다.)
또는
inv_map = dict((my_map[k], k) for k in my_map)
또는 python 3.0의 dict comprehensions 사용
inv_map = {my_map[k] : k for k in my_map}
답변
더 기능적인 다른 방법 :
my_map = { 'a': 1, 'b':2 }
dict(map(reversed, my_map.items()))
답변
이것은 Robert 의 대답 에 따라 확장 되어 dict의 값이 고유하지 않은 경우에 적용됩니다.
class ReversibleDict(dict):
def reversed(self):
"""
Return a reversed dict, with common values in the original dict
grouped into a list in the returned dict.
Example:
>>> d = ReversibleDict({'a': 3, 'c': 2, 'b': 2, 'e': 3, 'd': 1, 'f': 2})
>>> d.reversed()
{1: ['d'], 2: ['c', 'b', 'f'], 3: ['a', 'e']}
"""
revdict = {}
for k, v in self.iteritems():
revdict.setdefault(v, []).append(k)
return revdict
구현은 reversed
두 번 사용할 수 없으며 원본을 다시 가져올 수 없다는 제한이 있습니다 . 대칭이 아닙니다. Python 2.6으로 테스트되었습니다. 다음 은 결과 dict을 인쇄하는 데 사용하는 유스 케이스입니다.
당신이 오히려를 사용하는 거라고 경우 set
(A)보다 list
,이 대신에, 의미가있는 정렬되지 않은 응용 프로그램이 존재할 수 setdefault(v, []).append(k)
, 사용 setdefault(v, set()).add(k)
.