Saltar al contenido

Cómo Recorrer un Diccionario en Python

Recorrer un diccionario en Python

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?

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.

15 conceptos fundamentales que necesitas conocer para aprender y dominar Python

Te voy a hacer dos regalos (no uno, sino dos) que hablan de estos 15 conceptos fundamentales de Python: mi Tutorial Básico Interactivo de Python y una cheat sheet de Python en español: La Hoja de Referencia de Python.

Estos regalos son exclusivos para los suscriptores de Código Pitón.

👍 Quiero mis dos regalos

¿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:

>>> 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.

Recibe contenido exclusivo y obtén gratis la Hoja de Referencia de Python.

Antes de suscribirte consulta aquí la 
Información Básica sobre Protección de Datos. Responsable de datos: Juan Monroy Camafreita. 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 (MailRelay). 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!

 🎁 Tutorial Básico Interactivo y La Hoja de Referencia de Python – ¡Gratis!

La Hoja de Referencia de Python - Código Pitón
¿Quieres mejorar tu Python? Recibe totalmente gratis el Tutorial Básico Interactivo de Python, la Hoja de Referencia de Python y contenido exclusivo como trucos y consejos.



Antes de suscribirte consulta aquí la Información Básica sobre Protección de Datos. Responsable de los datos: Juan Monroy Camafreita. Finalidad de la recogida y tratamiento de los 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 (MailRelay). 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 en nuestra política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal, incluida información sobre acceso, conservación, rectificación, eliminación, seguridad y otros temas.