đã được trả lời, nhưng vì một số người đã đề cập đến việc đảo ngược từ điển, đây là cách bạn thực hiện trong một dòng (giả sử ánh xạ 1: 1) và một số dữ liệu hoàn hảo khác nhau:
trăn 2.6:
reversedict = dict([(value, key) for key, value in mydict.iteritems()])
2.7+:
reversedict = {value:key for key, value in mydict.iteritems()}
nếu bạn nghĩ rằng đó không phải là 1: 1, bạn vẫn có thể tạo ánh xạ ngược hợp lý với một vài dòng:
reversedict = defaultdict(list)
[reversedict[value].append(key) for key, value in mydict.iteritems()]
mức độ chậm của nó: chậm hơn so với tìm kiếm đơn giản, nhưng gần như không chậm như bạn nghĩ - trên từ điển nhập 100000 'thẳng', tìm kiếm 'nhanh' (nghĩa là tìm kiếm một giá trị nên có sớm trong các phím) nhanh hơn khoảng 10 lần so với đảo ngược toàn bộ từ điển và tìm kiếm 'chậm' (về cuối) nhanh hơn khoảng 4-5 lần. Vì vậy, sau tối đa khoảng 10 lần tra cứu, nó đã tự trả tiền.
phiên bản thứ hai (với danh sách cho mỗi mục) mất khoảng 2,5 lần miễn là phiên bản đơn giản.
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
Cũng có một số kết quả thú vị với ifilter. Về mặt lý thuyết, ifilter nên nhanh hơn, theo đó chúng ta có thể sử dụng itervalues () và có thể không phải tạo / đi qua toàn bộ danh sách giá trị. Trong thực tế, kết quả thật ... kỳ quặc ...
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
Vì vậy, đối với các độ lệch nhỏ, nó nhanh hơn đáng kể so với bất kỳ phiên bản nào trước đó (2,36 * u * S so với tối thiểu 1,48 * m * S đối với các trường hợp trước). Tuy nhiên, đối với các khoản bù đắp lớn gần cuối danh sách, tốc độ chậm hơn đáng kể (15,1ms so với cùng 1,48mS). Các khoản tiết kiệm nhỏ ở cấp thấp không xứng đáng với chi phí ở cấp cao, imho.