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 key
porción. ¿Cómo reconoce Python que solo necesita leer la clave del diccionario? ¿Es key
una palabra especial en Python? ¿O es simplemente una variable?
python
python-2.7
dictionary
El mejor chef
fuente
fuente
Respuestas:
key
es solo un nombre de variable.simplemente recorrerá las claves del diccionario, en lugar de las claves y los valores. Para recorrer tanto la clave como el valor, puede usar lo siguiente:
Para Python 3.x:
Para Python 2.x:
Para probarlo usted mismo, cambie la palabra
key
apoop
.En Python 3.x,
iteritems()
se reemplazó con simplementeitems()
, que devuelve una vista de conjunto respaldada por el dict,iteritems()
pero aún mejor. Esto también está disponible en 2.7 comoviewitems()
.La operación
items()
funcionará para 2 y 3, pero en 2 devolverá una lista de los(key, value)
pares del diccionario , que no reflejará los cambios en el dict que suceden después de laitems()
llamada. Si desea el comportamiento 2.x en 3.x, puede llamarlist(d.items())
.fuente
sorted
son necesarios para estabilizarlo.Keys and values are iterated over in insertion order.
[ docs.python.org/3/library/…No es que la clave sea una palabra especial, sino que los diccionarios implementan el protocolo iterador. Puede hacer esto en su clase, por ejemplo, vea 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 de diccionario":
En Python 3,
dict.iterkeys()
,dict.itervalues()
ydict.iteritems()
ya no son compatibles. Usodict.keys()
,dict.values()
y en sudict.items()
lugar.fuente
Iterar sobre un
dict
itera a través de sus teclas en ningún orden particular, como puede ver aquí:Editar: (Este ya no es el caso en Python3.6 , pero tenga en cuenta que todavía no se garantiza el comportamiento)
Para su ejemplo, es una mejor idea usar
dict.items()
:Esto te da una lista de tuplas. Cuando los recorres así, cada tupla se desempaqueta
k
yv
automáticamente:Usar
k
yv
como nombres de variables cuando se repite en un bucledict
es bastante común si el cuerpo del bucle tiene solo unas pocas líneas. Para bucles más complicados, puede ser una buena idea usar nombres más descriptivos:Es una buena idea acostumbrarse a usar cadenas de formato:
fuente
key
Es simplemente una variable.Para Python2.X :
... o mejor,
Para Python3.X :
fuente
Cuando itera a través de diccionarios usando la
for .. in ..
sintaxis, siempre itera sobre las claves (se puede acceder a los valores usandodictionary[key]
).Para iterar sobre pares clave-valor, en Python 2 use
for k,v in s.iteritems()
y en Python 3for k,v in s.items()
.fuente
items()
lugar deiteritems()
Este es un idioma de bucle muy común.
in
Es un operador. Para saber cuándo usarlofor key in dict
y cuándo debefor key in dict.keys()
verlo, artículo de David Goodger Idiomatic Python (copia archivada) .fuente
in
, la parte del operador es donde se verifica la existencia . Quizás sea mejor eliminar estain is an operator
información.No son solo
for
bucles. La palabra importante aquí es "iterar".Un diccionario es un mapeo de claves a valores:
Cada vez que iteramos sobre él, iteramos sobre las teclas. El nombre de la variable
key
solo pretende ser descriptivo, y es bastante apto para este propósito.Esto sucede en una lista de comprensión:
Sucede cuando pasamos el diccionario a la lista (o cualquier otro objeto de tipo de colección):
La forma en que Python itera es, en un contexto donde lo necesita, llama al
__iter__
método del objeto (en este caso, el diccionario) que devuelve un iterador (en este caso, un objeto keyiterator):No deberíamos usar estos métodos especiales nosotros mismos, en su lugar, use la función incorporada respectiva para llamarlo
iter
:Los iteradores tienen un
__next__
método, pero lo llamamos con la función integradanext
:Cuando un iterador se agota, se eleva
StopIteration
. Así es como Python sabe salir de unfor
bucle, o una comprensión de la lista, o una expresión generadora, o cualquier otro contexto iterativo. Una vezStopIteration
que se eleva un iterador , siempre lo elevará; si desea repetir nuevamente, necesita uno nuevo.Volviendo a los dictados
Hemos visto dictados iterando en muchos contextos. Lo que hemos visto es que cada vez que iteramos sobre un dict, obtenemos las claves. Regresando al ejemplo original:
Si cambiamos el nombre de la variable, aún obtenemos las claves. Vamos a intentarlo:
Si queremos iterar sobre los valores, necesitamos usar el
.values
método de dictados, o para ambos juntos.items
:En el ejemplo dado, sería más eficiente iterar sobre los elementos como este:
Pero para fines académicos, el ejemplo de la pregunta está bien.
fuente
Tengo un caso de uso en el que tengo que recorrer el dict para obtener la clave, el par de valores, también el índice que indica dónde estoy. Así es como lo hago:
Tenga en cuenta que los paréntesis alrededor de la clave, el valor es importante, sin los paréntesis, obtendrá un ValueError "no hay suficientes valores para desempaquetar".
fuente
Puede verificar la implementación de CPython
dicttype
en GitHub. Esta es la firma del método que implementa el iterador dict:CPython dictobject.c
fuente
Para iterar sobre las teclas, es más lento pero mejor usarlo
my_dict.keys()
. Si trataste de hacer algo como esto:crearía un error de tiempo de ejecución porque está cambiando las claves mientras se ejecuta el programa. Si está absolutamente decidido a reducir el tiempo, utilice el
for key in my_dict
camino, pero se le ha advertido;).fuente
Esto imprimirá la salida en orden ordenado por valores en orden ascendente.
Salida:
fuente