ya se ha respondido, pero dado que varias personas mencionaron invertir el diccionario, así es como lo hace en una línea (suponiendo un mapeo 1: 1) y algunos datos de rendimiento diferentes:
Python 2.6:
reversedict = dict([(value, key) for key, value in mydict.iteritems()])
2.7+:
reversedict = {value:key for key, value in mydict.iteritems()}
Si cree que no es 1: 1, aún puede crear una asignación inversa razonable con un par de líneas:
reversedict = defaultdict(list)
[reversedict[value].append(key) for key, value in mydict.iteritems()]
qué tan lento es esto: más lento que una simple búsqueda, pero no tan lento como se podría pensar: en un diccionario de entrada 100000 "directo", una búsqueda "rápida" (es decir, buscar un valor que debería estar al principio de las teclas) fue aproximadamente 10 veces más rápido que invertir todo el diccionario, y una búsqueda 'lenta' (hacia el final) aproximadamente 4-5 veces más rápido. Entonces, después de un máximo de 10 búsquedas, se paga solo.
la segunda versión (con listas por elemento) tarda aproximadamente 2.5 veces más que la versión simple.
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
También tuvo algunos resultados interesantes con ifilter. Teóricamente, ifilter debería ser más rápido, ya que podemos usar itervalues () y posiblemente no tener que crear / revisar la lista completa de valores. En la práctica, los resultados fueron ... extraños ...
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
Entonces, para pequeñas compensaciones, fue dramáticamente más rápido que cualquier versión anterior (2.36 * u * S vs. un mínimo de 1.48 * m * S para casos anteriores). Sin embargo, para grandes compensaciones cerca del final de la lista, fue drásticamente más lento (15,1 ms frente a los mismos 1,48 ms). Los pequeños ahorros en el extremo inferior no valen el costo en el extremo superior, en mi humilde opinión.