2010-07-11 17 views

Respuesta

22

Si lo hace a menudo, usted quiere construir un diccionario inverso:

>>> rev_ref = dict((v,k) for k,v in ref.iteritems()) 
>>> rev_ref 
{'def': 'abc'} 

>>> def revmapper(to): 
... return rev_ref[to] 

Si es raro, y no le importa si es ineficiente, hacer esto:

>>> def revmapper(to): 
... for k,v in ref.iteritems(): 
...  if v == to: return k 
+2

Para que quede claro, esto no sería posible con este dict 'd = {'a': [1, 2, 3]} ' – razpeitia

+2

@razpeitia: Para el diccionario inverso, eso es cierto, pero funcionaría con' d = {'a' :(1,2,3)} ', y no funcionaría si varias claves tuvieran los mismos valores ... usar el método ineficiente siempre, desafortunadamente, de manera ineficiente. – Stephen

5

Puede hacer un diccionario inverso:

revdict = dict((v,k) for k,v in ref.items()) 

mirad lo que quiere:

assert revdict["def"] == "abc" 

Nota esto no funcionará si dos teclas se asignan al mismo valor.

+0

+1 por simplicidad, aunque iteritems sería más rápido en este caso. – AaronAsAChimp

+0

Recuerde que '.items' es el [único método en Python3] (http://stackoverflow.com/a/10458567/1908115). Más rápido y más eficiente con la memoria. – erik

2
dict(map(lambda a:[a[1],a[0]], d.iteritems())) 
+0

No hay ninguna razón para usar map + lambda alguna vez. Vea las otras soluciones sobre cómo crear una lista de comprensión o expresión del generador. – habnabit

+0

@aaron: ¿cuál es la razón por la cual map + lambda es inferior a los demás? Supongo que hay algunas optimizaciones internas que lo hacen diferente. ¿cómo es (k, v) para ... mejor que el mapa (lambda ...? – eruciform

+0

1) sin función llamada sobrecarga. 2) mucho, mucho más fácil de leer, especialmente cuando hay desempaquetado involucrado. – habnabit