вже відповіли, але оскільки кілька людей згадували про перевернення словника, ось як ви це робите в одному рядку (припускаючи відображення 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,1 мс проти тих же 1,48 мс). Невеликі заощадження в нижньому кінці не варті витрат у найвищому кінці, imho.