2011-08-01 9 views
26

¿Podemos conocer la posición de los elementos en el diccionario ordenado de Python? Por ejemplo:Cómo saber la posición de los elementos en el diccionario ordenado de Python

Si tengo diccionario:

// Ordered_dict is OrderedDictionary 

Ordered_dict = {"fruit": "banana", "drinks": "water", "animal": "cat"} 

Ahora, ¿cómo saber en qué posición gato pertenece a? ¿Es posible obtener respuestas como:

position (Ordered_dict["animal"]) = 2 ? o de alguna otra manera?

+7

Tu diccionario no es un dict ordenado, es un dict simple de Python desordenado. –

+8

¡El hecho de que lo llames dict ordenado no lo convierte en uno! – Jacob

Respuesta

49

Usted puede obtener la lista de claves con la propiedad keys:

In [20]: d=OrderedDict((("fruit", "banana"), ("drinks", 'water'), ("animal", "cat"))) 

In [21]: d.keys().index('animal') 
Out[21]: 2 

Un mejor rendimiento se podría lograr con el uso de iterkeys() sin embargo.

Para aquellos que utilizan Python 3

>>> list(x.keys()).index("c") 
1 
+23

'list (d.keys()). Index ('animal')' para cualquier persona que use ** Python3 ** terminando aquí. – Torxed

+6

Parece que el simple uso de 'list (d) .index ('animal')' también funciona en Python 3, a menos que me falta algo. – Marein

+0

Para python 3, consulte: https://stackoverflow.com/q/44147047/281545 –

3

pensar primero que se necesita es leer la documentación. Si abre Guía de aprendizaje y luego intenta encontrar información sobre OrderedDict verá lo siguiente:

collections.OrderedDict clase ([artículos]) - Devuelve una instancia de una subclase dict , disponer de los métodos habituales dict. Un OrderedDict es un dict que recuerda el orden en que se insertaron las claves por primera vez. Si una nueva entrada sobrescribe una entrada existente, la posición de inserción original se deja sin cambios. Eliminar una entrada y reinsertarla lo moverá al final .

Nuevo en la versión 2.7.

Por lo tanto, en caso de que esté utilizando un diccionario ordenado y no vaya a eliminar las claves, entonces 'animal' estará siempre en la posición que agregue - por ej. índice 2.

también para obtener un índice de un 'gato' puede simplemente usar:

from collections import OrderedDict 
d = OrderedDict((("fruit", "banana"), ("drinks", "water"), ("animal", "cat"))) 
d.keys() 
>>> ['fruit', 'drinks', 'animal'] 
d.values() 
>>> ['banana', 'water', 'cat'] 
# So 
d.values().index('cat') 
>>> 2 
2

Para python3: tuple(d).index('animal')

Esto es casi la misma que la respuesta de Marein anterior, pero utiliza una tupla inmutable en lugar de una lista mutable. Por lo tanto, debe ejecutarse un poco más rápido (~ 12% más rápido en mi control rápido de cordura).

+0

Tenga en cuenta que esto también funciona en Python 2 (tuple (d) simplemente itera sobre las teclas del diccionario y produce una tupla) –

Cuestiones relacionadas