[python] Iteración sobre diccionarios que usan bucles 'for'


5 Answers

No es que esa clave sea una palabra especial, sino que los diccionarios implementan el protocolo de iterador. Podrías hacer esto en tu clase, por ejemplo, ver esta pregunta sobre cómo construir iteradores de clase.

En el caso de los diccionarios, se implementa en el nivel C. Los detalles están disponibles en PEP 234 . En particular, la sección titulada "Iteradores del diccionario":

  • Los diccionarios implementan una ranura tp_iter que devuelve un iterador eficiente que itera sobre las teclas del diccionario. [...] Esto significa que podemos escribir

    for k in dict: ...
    

    que es equivalente a, pero mucho más rápido que

    for k in dict.keys(): ...
    

    siempre que la restricción de modificaciones al diccionario (ya sea por el ciclo o por otro hilo) no se viole.

  • Agregue métodos a diccionarios que devuelven diferentes tipos de iteradores explícitamente:

    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...
    

    Esto significa que for x in dict se for x in dict.iterkeys() taquigrafia for x in dict.iterkeys() .

Question

Estoy un poco desconcertado por el siguiente código:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    print key, 'corresponds to', d[key]

Lo que no entiendo es la parte key . ¿Cómo reconoce Python que solo necesita leer la clave del diccionario? ¿Es la key una palabra especial en Python? ¿O es simplemente una variable?




Cuando itera a través de diccionarios usando la sintaxis for .. in .. , siempre itera sobre las teclas (se puede acceder a los valores usando el dictionary[key] ).

Para iterar sobre pares clave-valor, use for k,v in s.iteritems() .




Tengo un caso de uso en el que tengo que repetir el dict para obtener la clave, el par de valores y el índice que indica dónde estoy. Así es como lo hago:

d = {'x': 1, 'y': 2, 'z': 3} 
for i, (key, value) in enumerate(d.items()):
   print(i, key, value)

Tenga en cuenta que el paréntesis alrededor de la clave, el valor es importante, sin los paréntesis, se obtiene un ValueError "no hay valores suficientes para descomprimir".







Python 2

Los dictonarios son tan importantes tpo Python que también son muy fáciles de usar. Para iterar a través de cada tecla de un diccionario, simplemente utiliza "para k en d" o "para la clave en d" o cualquier variable en lugar de k o clave como en mis ejemplos. Esto se debe a que, de forma predeterminada, puede repetir las claves del diccionario de esta manera. para acceder a los valores de las claves, simplemente nos d [k] o d [tecla] o d [nombre de la variable] dependiendo de la variable que usó en el ciclo para iterar las teclas.

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    print key, 'corresponds to', d[key]

Python 3.6

también puedes hacer algo como esto:

d = {'x': 1, 'y': 2, 'z': 3} 
for k,v in d.items():
    print(k,":",v)

salida

x : 1
y : 2
z : 3



Puede verificar la implementación de dicttype dicttype en github. Esta es la firma del método que implementa el iterador dict:

_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
         PyObject **pvalue, Py_hash_t *phash)

cpython dictobject.c




Related