이미 답변을 받았지만 여러 사람들이 사전을 뒤집는 것에 대해 언급 했으므로 다음은 한 줄로 수행하는 방법 (1 : 1 매핑 가정) 및 다양한 성능 데이터입니다.
파이썬 2.6 :
reversedict = dict([(value, key) for key, value in mydict.iteritems()])
2.7+ :
reversedict = {value:key for key, value in mydict.iteritems()}
1 : 1이 아니라고 생각하면 몇 줄로 합리적인 역 매핑을 만들 수 있습니다.
reversedict = defaultdict(list)
[reversedict[value].append(key) for key, value in mydict.iteritems()]
얼마나 느린가 : 간단한 검색보다 느리지 만 생각보다 느리지는 않습니다- '똑똑한'100000 항목 사전, '빠른'검색 (즉, 키의 초기에 있어야하는 값을 찾는 것) 전체 사전을 뒤집는 것보다 약 10 배 더 빠르며 (끝까지) '느린'검색은 약 4-5 배 더 빠릅니다. 따라서 최대 약 10 회의 조회 후 자체 비용이 지불됩니다.
두 번째 버전 (항목 당 목록 포함)은 단순 버전보다 약 2.5 배가 걸립니다.
largedict = dict((x,x) for x in range(100000))
# Should be slow, has to search 90000 entries before it finds it
In [26]: %timeit largedict.keys()[largedict.values().index(90000)]
100 loops, best of 3: 4.81 ms per loop
# Should be fast, has to only search 9 entries to find it.
In [27]: %timeit largedict.keys()[largedict.values().index(9)]
100 loops, best of 3: 2.94 ms per loop
# How about using iterkeys() instead of keys()?
# These are faster, because you don't have to create the entire keys array.
# You DO have to create the entire values array - more on that later.
In [31]: %timeit islice(largedict.iterkeys(), largedict.values().index(90000))
100 loops, best of 3: 3.38 ms per loop
In [32]: %timeit islice(largedict.iterkeys(), largedict.values().index(9))
1000 loops, best of 3: 1.48 ms per loop
In [24]: %timeit reversedict = dict([(value, key) for key, value in largedict.iteritems()])
10 loops, best of 3: 22.9 ms per loop
In [23]: %%timeit
....: reversedict = defaultdict(list)
....: [reversedict[value].append(key) for key, value in largedict.iteritems()]
....:
10 loops, best of 3: 53.6 ms per loop
또한 ifilter로 흥미로운 결과를 얻었습니다. 이론적으로 ifilter는 itervalues ()를 사용할 수 있고 전체 값 목록을 만들거나 갈 필요가 없다는 점에서 더 빠릅니다. 실제로 결과는 ... 홀수 ...
In [72]: %%timeit
....: myf = ifilter(lambda x: x[1] == 90000, largedict.iteritems())
....: myf.next()[0]
....:
100 loops, best of 3: 15.1 ms per loop
In [73]: %%timeit
....: myf = ifilter(lambda x: x[1] == 9, largedict.iteritems())
....: myf.next()[0]
....:
100000 loops, best of 3: 2.36 us per loop
따라서 작은 오프셋의 경우 이전 버전 (2.36 * u * S 대 이전 사례의 경우 최소 1.48 * m * S)보다 훨씬 빠릅니다. 그러나 목록 끝 근처의 큰 오프셋의 경우 속도가 크게 느려졌습니다 (15.1ms vs. 동일한 1.48mS). 낮은 가격의 작은 절약은 높은 비용의 가치가 없습니다.