[python] 사전 매핑 반전 / 반전

다음과 같은 사전이 주어집니다.

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