2012-07-24 20 views
13

Duplicar posible:
Inverse dictionary lookup - Python
reverse mapping of dictionary with PythonPython: obtener la clave de índice en el diccionario

¿Cómo llego clave de índice en el diccionario?

Por ejemplo, como:

i = {'a': 0, 'b': 1, 'c': 2} 

por lo que si quiero conseguir clave de la i [0], volverá 'a'

+0

Desea asignar el valor * * volver a la llave No hay índice en un dict de pitón. –

+0

Ver http://stackoverflow.com/questions/3221475/reverse-mapping-of-dictionary-with-python y http://stackoverflow.com/questions/483666/python-reverse-inverse-a-mapping –

Respuesta

5

Por diccionarios definición son desordenados, y por lo tanto no pueden ser indexados. Para ese tipo de funcionalidad utiliza un diccionario ordenado. Python Ordered Dictionary

+0

'OrderedDict 's no se puede indexar tampoco. – Julian

+0

Es cierto, pero cuando se llaman dict.keys() o dict.values ​​() se conserva la orden. Entonces el índice en estas listas corresponde al "índice" del diccionario – underbar

17

Los diccionarios de Python tienen una clave y un valor, lo que está pidiendo es qué tecla (s) apuntan a un valor dado.

Sólo se puede hacer esto en un bucle:

[k for (k, v) in i.iteritems() if v == 0] 

Tenga en cuenta que no puede haber más de una tecla por cada valor en un diccionario; {'a': 0, 'b': 0} es perfectamente legal.

Si usted quiere pedir ya sea que tenga que utilizar una lista o una OrderedDict instance lugar:

items = ['a', 'b', 'c'] 
items.index('a') # gives 0 
items[0]   # gives 'a' 
+1

No piense que esto es lo que estaba preguntando. Él quiere "indexar" usando una posición numerada como en una lista –

+0

@PaulSeeb: estamos adivinando qué significaba el OP, veamos si habrá alguna aclaración. –

16

Usted podría hacer algo como esto:

i={'foo':'bar', 'baz':'huh?'} 
keys=i.keys() #in python 3, you'll need `list(i.keys())` 
values=i.values() 
print keys[values.index("bar")] #'foo' 

Sin embargo, cada vez que cambie su diccionario, deberá actualizar sus claves, valores porque los diccionarios no están ordenados. Cada vez que inserta un nuevo par clave/valor, el pedido que pensó que tenía se va y es reemplazado por un nuevo orden (más o menos aleatorio). Por lo tanto, pedir el índice en un diccionario no tiene sentido.

También tenga en cuenta que lo que está preguntando probablemente no sea lo que realmente desea. No hay garantía de que el mapeo inverso en un diccionario sea único. En otras palabras, usted podría tener el siguiente diccionario:

d={'i':1, 'j':1} 

En ese caso, es imposible saber si desea i o j y de hecho hay una respuesta aquí será capaz de decirle lo que ('i' o 'j') se elegirá (nuevamente, porque los diccionarios no están ordenados). ¿Qué quieres que pase en esa situación? Podría obtener una lista de claves aceptables ... pero supongo que su comprensión fundamental de los diccionarios no es del todo correcta.

+0

Creo que su respuesta es muy engañosa. Los diccionarios están desordenados. No debe publicar un trabajo en torno a algo que fundamentalmente desafía la lógica de programación. –

+0

@PaulSeeb - He actualizado. ¿Eso ayuda en absoluto? – mgilson

+0

@PaulSeeb - ¿Y por qué crees que agregué todo el "Lo que estás pidiendo probablemente no es lo que quieres" y "Supongo que tu comprensión fundamental de los diccionarios no es del todo correcta"? – mgilson

0

Por def. diccionario es una colección no ordenada del par clave-valor. así que no puedes tener un índice para el par clave-valor. Puede guardarlos en dos listas ordenadas con el mismo valor de índice para clave y valor. Luego, para cada clave en un índice particular en la lista de claves, puede recuperar el valor relacionado de la lista de valores.

O mejor utilizar un diccionario ordenado.

d = OrderedDict([('first', 1), 

... ('segundo', 2), ... ('tercer', 3)])

Marque esta ordered list

Cuestiones relacionadas