Te explico en este artículo las maneras de recorrer o iterar un diccionario de Python. ¿Necesitas recorrer solo las claves? No hay problema. ¿Acaso lo que te interesa es iterar por los valores? Muy fácil. O, a lo mejor, lo que quieres es recorrer los pares clave - valor. También se puede hacer.
Para recorrer las claves de un diccionario en Python se puede hacer for clave in diccionario
. Para recorrer los valores: for valor un diccionario.values()
. Para recorrer los pares clave-valor: for clave, valor in diccionario.items()
.
Te detallo este pequeño resumen a continuación y te lo ilustro con ejemplos. Además te introduzco el concepto de protocolo de iteración. ¡Sigue leyendo!
- ¿Se puede recorrer un diccionario?
- Recorrer las claves de un diccionario en Python
- Recorrer los valores de un diccionario en Python
- Recorrer los pares clave - valor de un diccionario en Python
- Recorrer diccionarios anidados en Python
- Cómo obtener listas de las claves y valores de un diccionario
- Conclusiones
¿Se puede recorrer un diccionario?
Los diccionarios en Python implementan el protocolo de iteración. Resumiendo, este protocolo permite a los objetos que representan una colección de elementos ser recorridos elemento a elemento de manera sencilla y cómoda.
El protocolo de iteración se describe en el PEP 234.
Para cumplir este protocolo, los objetos deben implementar el método __iter__
que devuelve un objeto de tipo iterator
, el iterador, y que se invoca cuando usamos la función iter
a la que le proporcionamos el objeto cuestión como parámetro. Este objeto nos permite ir obteniendo un elemento diferente cada vez que llamamos a la función next
sobre el iterador.
Veamos un ejemplo con una lista, que también cumple este protocolo de iteración. Basta con crear una lista, llamar a la función iter
para obtener un iterator
y llamar a next
pasándole el iterador para ir obteniendo elementos hasta que se acaben todos.
>>> lista = [10, 20, 30]
>>> iterador = iter(lista)
>>> next(lista)
>>> next(iterador)
10
>>> next(iterador)
20
>>> next(iterador)
30
>>> next(iterador)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Como puedes ver, sin tener que preocuparnos de índices podemos ir obteniendo los elementos de uno en uno. Solo tenemos que preocuparnos si se acaban los elementos, pues obtendremos un error de StopIteration
.
Esta no es la manera más normal que tenemos de realizar recorridos, pero es precisamente este mecanismo el que nos permite recorrer de manera muy cómoda los elementos de una lista con un bucle for
como ya conoces, la forma más habitual:
>>> lista = [10, 20, 30]
>>> for elemento in lista:
... print(elemento)
...
10
20
30
Cuando realizamos un recorrido de este tipo con for
por detrás se está invocando a las funciones iter
y next
que te acabo de explicar.
Pues bien, vamos con los diccionarios. Los diccionarios en Python también pueden ser recorridos con un bucle for
ya que, como te dije al principio, también cumplen el protocolo de iteración.
Pero, claro, hay una diferencia, pues un elemento de un diccionario se compone de dos partes: la clave y el valor. Vamos a ver como hacer el recorrido entonces según lo que necesitemos: clave, valor o ambos. Pero ten en cuenta que siempre vamos a utilizar el protocolo de iteración.
¡IMPORTANTE! Recuerda siempre que, en general, las colecciones de elementos no deben ser modificadas (añadir o eliminar elementos) mientras se recorren. Esto alteraría el recorrido generando errores y efectos no esperados.
Recorrer las claves de un diccionario en Python
Vamos a empezar con el recorrido más sencillo de realizar, que es el de las claves. Si intentamos recorrer un diccionario, como te he contado arriba, con un bucle for
y mostramos cada elemento por pantalla, lo que obtendremos serán las claves.
Lo vemos:
>>> diccionario = {10:'diez', 20:'veinte', 30:'treinta'}
>>> for elemento in diccionario:
... print(elemento)
...
10
20
30
A priori esto no parece muy útil pues la información principal suelen ser los valores. No obstante, teniendo las claves ya podemos acceder a cualquier valor, así que en realidad, con este recorrido ya lo tenemos todo:
>>> diccionario = {10:'diez', 20:'veinte', 30:'treinta'}
>>> for clave in diccionario:
... print(clave, '->', diccionario[clave])
...
10 -> diez
20 -> veinte
30 -> treinta
¡Y listo! En realidad no necesitas nada más. Con esto ya lo tienes todo, como te digo. Puedes dejar de leer aquí o seguir leyendo para aprender más y otras maneras de recorrer diccionarios.
Te envío todos los días un consejo para que cada día seas mejor en Python.
Siempre sobre Python y programación.
Más de 2500 personas como tú los reciben cada día.
Día que estás fuera, consejo sobre Python que te pierdes.
Antes de suscribirte consulta aquí la
Finalidad de recogida y tratamiento de datos personales: enviarte boletín informativo de Python y comunicaciones comerciales.
Legitimación: tu consentimiento.
Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (GetResponse).
Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control.
Más información: política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal.
¿Sigues aquí? ¡Genial! 🙂
Esto sucede así porque cuando solicitamos un iterador a un diccionario a través de la función iter
, este nos devuelve un iterador para las claves. Recuerda que for
hace esto de manera transparente al programador.
También es interesante conocer el método keys
. Este método nos devuelve un objeto de clase dict_keys
, que es una vista dinámica que encapsula un conjunto con las claves del diccionario. Este objeto también cumple el protocolo de iteración así que podremos recorrer las claves también de esta manera:
>>> diccionario = {10:'diez', 20:'veinte', 30:'treinta'}
>>> for clave in diccionario.keys():
... print(clave)
...
10
20
30
¿Qué sucede si no necesitamos las claves? Es decir, que solo queremos los datos indexados, es decir, los valores. Veamos la manera de hacerlo.
Recorrer los valores de un diccionario en Python
Generalmente, la información más importante de un diccionario son los valores que tenemos indexados. Es por ello que a veces solo necesitamos estos valores y no las claves.
Los diccionarios de Python poseen un método values
que nos devuelve un objeto del tipo dict_values
que es una vista dinámica que encapsula una lista con los valores. Este objeto también cumple el protocolo de iteración, así que podremos iterar sobre ellos, es decir, recorrerlos, haciendo uso de iter
y next
o de un bucle for
.
Lo vemos:
>>> diccionario = {10:'diez', 20:'veinte', 30:'treinta'}
>>> diccionario.values()
dict_values(['diez', 'veinte', 'treinta'])
>>> for valor in diccionario.values():
... print(valor)
...
diez
veinte
treinta
Cómodo y directo. Eso sí, ten en cuenta que no tenemos las claves, solo los valores. En este sentido hemos perdido la asociación clave - valor (aunque sigue existiendo en el diccionario). Pero bueno, eso era lo que queríamos.
Veamos otra manera de hacer recorridos.
Recorrer los pares clave - valor de un diccionario en Python
Ya vimos la manera de recorrer solo los valores y solo las claves (aunque esta manera es muy potente pues podemos acceder a los valores a partir de las claves). Ahora vamos a ver una tercera manera de recorrer los diccionarios, que es obteniendo todo el par clave - valor en cada iteración.
Con este recorrido, tendremos acceso a la clave y al valor sin necesidad de ir a buscar el valor partir de la clave.
La clase dict
, que es la que implementa los diccionarios en Python, posee otro método llamado items
. Este método devuelve un objeto de tipo dict_items
, que es una vista dinámica de los pares clave - valor, y que también implementa el protocolo de iteración.
dict_items
encapsula un conjunto de tuplas. Cada tupla tiene dos elementos en donde el primer elemento corresponde con una clave y el segundo con el valor asociado a dicha clave.
Así, al recorrer un objeto dict_items
con un bucle for
, vamos a tener una de estas tuplas en cada iteración:
>>> diccionario = {10:'diez', 20:'veinte', 30:'treinta'}
>>> diccionario.values()
dict_values(['diez', 'veinte', 'treinta'])
>>> for valor in diccionario.values():
... print(valor)
...
diez
veinte
treinta
Como es evidente, podemos acceder de manera individual a los elementos de la tupla si así lo necesitamos:
>>> diccionario = {10:'diez', 20:'veinte', 30:'treinta'}
>>> for item in diccionario.items():
... print(item[0], '->', item[1])
...
10 -> diez
20 -> veinte
30 -> treinta
De todas formas, esta solución es un poco engorrosa al tener que utilizar índices. Para resolverlo podemos desempaquetar la tupla en dos variables y acceder a ellas de manera más sencilla.
Recuerda que el desempaquetado funciona de esta manera:
>>> a, b, c = (1, 2, 3)
>>> print(a, b, c)
1 2 3
Así, de la misma manera, podemos hacer lo siguiente:
15 conceptos fundamentales que necesitas conocer para aprender y dominar Python
Te voy a hacer cuatro regalos (no uno, no dos, no tres, cuatro) que hablan de estos 15 conceptos fundamentales de Python: mi Tutorial Básico Interactivo de Python, una cheat sheet de Python en español: La Hoja de Referencia de Python, una guía de ChatGPT y Python y 30 ejercicios de Python (es un reto para ti).
Estos regalos son exclusivos para los suscriptores de Código Pitón.
>>> diccionario = {10:'diez', 20:'veinte', 30:'treinta'}
>>> for clave, valor in diccionario.items():
... print(clave, '->', valor)
...
10 -> diez
20 -> veinte
30 -> treinta
Hasta aquí los tres recorridos principales. Veamos ahora el caso particular en el que tenemos diccionarios anidados. Es decir, los valores de un diccionario son, a su vez, diccionarios.
Recorrer diccionarios anidados en Python
Cuando tenemos diccionarios anidados debemos buscar la manera de recorrerlos, pues es un caso muy particular que Python no va a resolver por nosotros, porque nuestras necesidades pueden ser muy diferentes. Eso sí, podemos o tendremos que usar los recorridos básicos que hemos visto hasta ahora en este artículo.
Vamos a suponer que tenemos lo siguiente:
diccionario = {
10: {101: 'perro', 102: 'gato', 103: 'vaca'},
20: {201: 'pulpo', 202: 'calamar'},
30: {301: 'mosquito', 302: 'libélula', 303: 'abeja', 304: 'mariposa'}
}
Podemos necesitar cualquier tipo de recorrido. Algunos ejemplos:
- Recorrer todas las claves de los diccionarios internos.
- Recorrer todas las claves (del diccionario principal y los internos)
- Recorrer todos los elementos de los diccionarios internos.
La idea aquí es que para acceder a los diccionarios internos tendremos que recorrer los elementos del principal. Así que necesitamos hacer un recorrido dentro de otro, es decir, un bucle dentro de otro, es decir, bucles anidados.
Recorreremos primero el diccionario externo y con cada uno de los elementos haremos otro recorrido.
También se presentan aquí varias posibilidades, pues podemos hacer un tipo de recorrido u otro según necesitemos, es decir, recorrido de claves, de valores o de ambas cosas a la vez.
Veamos un ejemplo en el que solo queremos las claves de los diccionarios internos. Podemos hacer lo siguiente:
for diccionario_interno in diccionario.values(): # recorremos los valores del principal
for clave_interna in diccionario_interno: # recorremos las claves de los internos
print(clave_interna)
Utilizamos values
para obtener los valores del diccionario principal, que son los diccionarios internos. Y tendremos el siguiente resultado:
101 102 103 201 202 301 302 303 304
¿Qué pasa si necesitamos todos los valores de los diccionarios internos y no las claves? Lo vemos:
for diccionario_interno in diccionario.values(): # recorremos los valores del diccionario principal
for valor_interno in diccionario_interno.values(): # recorremos los valores de los diccionarios internos
print(valor_interno)
Fíjate en que utilizamos la función values
a la hora de recorrer los diccionarios, tanto el principal como los internos. Resultado:
perro gato vaca pulpo calamar mosquito libélula abeja mariposa
Finalmente, vamos a obtener todas las claves, tanto las del diccionario principal como la de los internos:
for clave in diccionario: # recorremos las claves del diccionario principal
print(clave) # obtenemos la clave principal
for clave_interna in diccionario[clave]: # recorremos las claves de los diccionarios internos
print(clave_interna)
Aquí no usamos values
. En su lugar usamos el recorrido por defecto, pues necesitamos poder acceder a las claves del diccionario principal. Y es precisamente a partir de estas claves de donde extraemos los diccionarios internos mediante diccionario[clave]
. El resultado obtenido es:
10 101 102 103 20 201 202 30 301 302 303 304
Te dejo como ejercicio lo siguiente: intenta obtener las claves del diccionario principal y los valores de los internos. ¡Es muy sencillo!
Ten en cuenta que a veces no necesitamos hacer estos recorridos recursivos. Lo interesante puede ser combinar o unir varios diccionarios en uno solo. Te explico en otro artículo cómo unir varios diccionarios en uno solo.
Cómo obtener listas de las claves y valores de un diccionario
Si solo necesitas realizar un recorrido para obtener listas de las claves, valores o ambas cosas de un diccionario no es necesario que realices un bucle para construir tu lista. Puedes utilizar la función list
para convertir cualquiera de las vistas dict_keys
, dict_values
y dict_items
que ya hemos visto en listas. list
se encargará de hacer el recorrido por nosotros.
Te muestro ejemplos:
>>> list(diccionario)
[10, 20, 30]
>>> list(diccionario.keys()) # alternativa
[10, 20, 30]
>>> list(diccionario.values())
['diez', 'veinte', 'treinta']
>>> list(diccionario.items())
[(10, 'diez'), (20, 'veinte'), (30, 'treinta')]
Conclusiones
A pesar de lo aparentemente sencillo de realizar recorridos en una estructura básica de Python como son los diccionarios, hemos aprendido mucho en este artículo.
Día que estás fuera, consejo sobre Python que te pierdes.
Antes de suscribirte consulta aquí la
Finalidad de recogida y tratamiento de datos personales: enviarte boletín informativo de Python y comunicaciones comerciales.
Legitimación: tu consentimiento.
Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (GetResponse).
Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control.
Más información: política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal.
Por un lado hemos visto de manera muy resumida el protocolo de iteración. Es un concepto importante que hay que entender para llegar a dominar el lenguaje.
Por otro lado, hemos visto que podemos iterar de varias maneras un diccionario según necesitemos valores, claves o ambos.
Finalmente hemos visto cómo obtener listas a partir de los elementos de un diccionario de manera muy sencilla.
¡Gracias por leer! Espero que te haya resultado útil.
Subscríbete a Código Pitón para recibir contenido exclusivo, trucos y consejos y este regalo.
¡Feliz programación!
Te envío todos los días un consejo para que cada día seas mejor en Python.
Siempre sobre Python y programación.
Más de 2500 personas como tú los reciben cada día.
Día que estás fuera, consejo sobre Python que te pierdes.
Antes de suscribirte consulta aquí la
Finalidad de recogida y tratamiento de datos personales: enviarte boletín informativo de Python y comunicaciones comerciales.
Legitimación: tu consentimiento.
Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (GetResponse).
Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control.
Más información: política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal.