sudah dijawab, tetapi karena beberapa orang menyebutkan membalik kamus, inilah cara Anda melakukannya dalam satu baris (dengan asumsi pemetaan 1: 1) dan beberapa data berbeda:
python 2.6:
reversedict = dict([(value, key) for key, value in mydict.iteritems()])
2.7+:
reversedict = {value:key for key, value in mydict.iteritems()}
jika menurut Anda ini bukan 1: 1, Anda masih dapat membuat pemetaan terbalik yang masuk akal dengan beberapa baris:
reversedict = defaultdict(list)
[reversedict[value].append(key) for key, value in mydict.iteritems()]
seberapa lambat ini: lebih lambat dari pencarian sederhana, tetapi tidak sepelan yang Anda kira - pada kamus entri 'lurus' 100000, pencarian 'cepat' (yaitu mencari nilai yang seharusnya berada di awal tombol) sekitar 10x lebih cepat daripada membalik seluruh kamus, dan pencarian 'lambat' (menjelang akhir) sekitar 4-5x lebih cepat. Jadi setelah paling banyak sekitar 10 pencarian, itu dibayar untuk dirinya sendiri.
versi kedua (dengan daftar per item) memakan waktu sekitar 2,5x selama versi sederhana.
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
Juga ada beberapa hasil menarik dengan ifilter. Secara teoritis, ifilter harus lebih cepat, karena kita dapat menggunakan itervalues () dan mungkin tidak harus membuat / menelusuri seluruh daftar nilai. Dalam prakteknya, hasilnya ... aneh ...
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
Jadi, untuk offset kecil, secara dramatis lebih cepat daripada versi sebelumnya (2,36 * u * S vs minimum 1,48 * m * S untuk kasus sebelumnya). Namun, untuk offset besar di dekat akhir daftar, itu secara dramatis lebih lambat (15,1 ms vs 1,48 ms yang sama). Penghematan kecil di ujung bawah tidak sebanding dengan biaya di ujung atas, imho.