2010-12-01 401 views
48

Tengo un diccionario a continuación:¿Cómo indexar en un diccionario?

colors = { 
    "blue" : "5", 
    "red" : "6", 
    "yellow" : "8", 
} 

Cómo hacer yo índice de la primera entrada en el diccionario?

colors[0] devolverá un KeyError por razones obvias.

+3

¿Qué significa "primero" significa? Los diccionarios no tienen orden. –

Respuesta

62

Los diccionarios no están ordenados en Python. Si no le importa el orden de las entradas y desea acceder a las claves o valores por índice de todos modos, puede usar d.keys()[i] y d.values()[i] o d.items()[i]. (Tenga en cuenta que estos métodos crean una lista de todas las claves, valores o elementos, respectivamente. Si los necesita más de una vez, guarde la lista en una variable para mejorar el rendimiento.)

Si le importa el orden de las entradas, comenzando con Python 2.7 puede usar collections.OrderedDict. O utilice una lista de pares

l = [("blue", "5"), ("red", "6"), ("yellow", "8")] 

si no necesita acceder por clave. (¿Por qué son los números de cuerdas en el camino?)

+2

En Python 2, use 'd.iterkeys(). Next()' en lugar de 'd.keys() [0]' para inspeccionar una de las claves sin eliminarla. Si el diccionario es enorme, hará una gran diferencia en términos de rendimiento. Lo mismo ocurre con los valores y los artículos. En Python 2.7 también puede usar [dict view objects] (http://docs.python.org/2/library/stdtypes.html#dictionary-view-objects) – simleo

+10

En Python 3, estas llamadas devuelven una vista, en lugar de una lista real, por lo que debe envolverlos en una llamada a list() de lo contrario verá: "TypeError: 'object dict_values' no admite la indexación". Vea esto S.O. pregunta: http://stackoverflow.com/questions/17431638/get-typeerror-dict-values-object-does-not-support-indexing-when-using-python – stifin

+1

Solo una pequeña corrección: no se puede indexar items(), al menos no en Python 3. –

1

No se puede, desde dict es desordenada. puede usar .popitem() para obtener un elemento arbitrario, pero eso lo eliminará del dict.

+0

'next (iter (d.items()))' ('.iteritems()' en Python 2) también le da un elemento arbitrario (el mismo en mis pruebas, lo cual tiene sentido ya que popitem puede implementarse usando esto) pero no eliminará el artículo. – delnan

3

Si necesita un diccionario ordenada, puede utilizar odict.

+0

odict ve no admitir la indexación en keys(), values ​​() o items(). – Konstantin

0

Los diccionarios no están listas.

con listas que puede hacer enter foo[0] here para obtener ese valor.

Dicts tiene funciones .value y .keys().

También es más adviceable de usar try/excepto en cualquier momento que iterar a través de un dict.

3

realidad me encontré con una novedosa solución que realmente me ayudó a salir, si usted está especialmente preocupado con el índice de un cierto valor en una lista o conjunto de datos, sólo se puede establecer el valor de diccionario para que Índice !:

simplemente ver:

list = ['a', 'b', 'c'] 
dictionary = {} 
counter = 0 
for i in list: 
    dictionary[i] = counter 
    counter += 1 

print(dictionary) # dictionary = {'a':0, 'b':1, 'c':2} 

Ahora través del poder de HashMaps se puede tirar el índice de sus entradas en tiempo constante (también conocido como un conjunto mucho más rápido)

3

Dirigiéndose a un elemento de diccionario es como sentarse en burro y disfruta el viaje.

Como regla de Python diccionario es inodora

Si hay

dic = {1: "a", 2: "aa", 3: "aaa"} 

Supongamos ahora si voy como dic[10] = "b", entonces no va a añadir como esto siempre

dic = {1:"a",2:"aa",3:"aaa",10:"b"} 

Puede ser como

dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"} 

O

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"} 

O

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"} 

o cualquier combinación.

Así regla del pulgar es DICCIONARIO es inodora !

21

Si alguien todavía mirando a esta pregunta, la respuesta aceptada actualmente se ha quedado desfasado:

Como Python 3.6 los diccionarios son fin de preservación, es que ahora se comportan exactamente como collections.OrderedDict s antes. Por desgracia, todavía no existe un método específico para indexar en keys()/values() del diccionario, así que conseguir la primera clave/valor en el diccionario puede hacerse como

first_key = list(colors.keys())[0] 
first_val = list(colors.values())[0] 

o alternativamente (esto evita crear instancias de las teclas ver en una lista):

def get_first_key(dictionary): 
    for key in dictionary.keys(): 
     return key 

first_key = get_first_key(colors) 
first_val = colors[first_key] 

Si necesita una clave -ésimo n, a continuación, de manera similar

def get_nth_key(dictionary, n=0): 
    if n < 0: 
     n += len(dictionary) 
    for i, key in enumerate(dictionary.keys()): 
     if i == n: 
      return key 
    raise IndexError("dictionary index out of range") 
Cuestiones relacionadas