déjà répondu, mais comme plusieurs personnes ont mentionné l'inversion du dictionnaire, voici comment vous le faites en une seule ligne (en supposant un mappage 1: 1) et quelques données de perf différentes:
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 vous pensez que ce n'est pas 1: 1, vous pouvez toujours créer un mappage inverse raisonnable avec quelques lignes:
reversedict = defaultdict(list)
[reversedict[value].append(key) for key, value in mydict.iteritems()]
à quel point est-ce lent: plus lent qu'une simple recherche, mais pas aussi lent que vous le pensez - sur un dictionnaire 100000 entrées «droit», une recherche «rapide» (c'est-à-dire la recherche d'une valeur qui devrait être au début des touches) était environ 10 fois plus rapide que l'inversion de l'ensemble du dictionnaire, et une recherche «lente» (vers la fin) environ 4 à 5 fois plus rapide. Donc, après une dizaine de recherches au maximum, il est amorti.
la deuxième version (avec listes par article) prend environ 2,5 fois plus longtemps que la version 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
A également eu des résultats intéressants avec ifilter. Théoriquement, ifilter devrait être plus rapide, en ce sens que nous pouvons utiliser itervalues () et ne pas avoir à créer / parcourir la liste de valeurs entière. En pratique, les résultats étaient ... bizarres ...
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
Ainsi, pour les petits décalages, il était considérablement plus rapide que n'importe quelle version précédente (2,36 * u * S contre un minimum de 1,48 * m * S pour les cas précédents). Cependant, pour les grands décalages vers la fin de la liste, il a été considérablement plus lent (15,1 ms contre les mêmes 1,48 ms). Les petites économies au bas de gamme ne valent pas le coût au haut de gamme, à mon humble avis.