Python: Recorriendo un diccionario de principio a fin

Objetivo: aprender a recorrer con un bucle for las claves, los valores o ambos de un diccionario en Python.

En numerosas ocasiones necesitaremos iterar a través de un diccionario mediante un bucle for. Voy a mostrarte lo sencillo que es y, para eso, te presentaré tres nuevos métodos que debes incorporar en tu kit de herramientas. Si has aterrizado en este artículo de modo casual y es la primera vez que te expones a los diccionarios en Python, te recomiendo que consultes el índice que figura en el menú o al final del artículo y estudies los artículos previos, que introducen los diccionarios desde cero.

Echa las manos al intérprete interactivo y genera un diccionario de pruebas:

>>> macedonia = {'plátano':'amarillo', 'fresa':'roja'}

Imagina que quieres trabajar con las claves de ese diccionario. ¿Cómo las obtenemos?

Empleando el método keys():

>>> frutas = macedonia.keys()
>>> frutas
dict_keys(['fresa', 'plátano'])

Si observas frutas, encontrarás las claves del diccionario, pero se trata de un objeto especial, claves de diccionario. Deja que te lo explique:

Lo que has obtenido es una vista del diccionario. Es como si observaras un objeto, el diccionario, desde una perspectiva diferente que sólo te permitiera apreciar determinadas características.

Hay dos cosas particularmente importantes en las vistas.

La primera es que lo que estás viendo a través de ellas es el objeto real. Si modificamos el diccionario, la vista se actualizará dinámicamente. Obśervalo.

Vamos a agregar un nuevo par clave-valor al diccionario y veamos qué sucede con la vista:

>>> macedonia['manzana'] = 'verde'
>>> macedonia
{'fresa': 'roja', 'plátano': 'amarillo', 'manzana': 'verde'}

¿Qué crees que contendrá ahora la vista frutas?

>>> frutas
dict_keys(['fresa', 'plátano', 'manzana'])

Como ves, se ha actualizado automáticamente sin necesidad de volvera a invocar al método?

La segunda particularidad de las vistas es que ya están preparadas para que puedas iterar sobre ellas:

>>> for fruta in frutas:
  print(fruta)

  
fresa
plátano
manzana

Tras lo cual hemos recuperado todas las claves del diccionario.

Si queremos iterar sobre los valores, en lugar de las claves, disponemos de otro método que genera una nueva vista:

>>> colores = macedonia.values()
>>> colores
dict_values(['roja', 'amarillo', 'verde'])

El método values() nos genera una vista sólo de valores sobre la que ya podemos iterar:

>>> for color in colores:
  print(color)

  
roja
amarillo
verde

Finalmente, ¿y si necesitamos iterar sobre las claves y sus correspondientes valores simultáneamente? La respuesta la encontrarás en el método items():

>>> elementos = macedonia.items()
>>> elementos
dict_items([('fresa', 'roja'), ('plátano', 'amarillo'), ('manzana', 'verde')])

Fíjate cómo iteramos ahora:

>>> for fruta, color in elementos:
  print(fruta, '-->', color)

  
fresa --> roja
plátano --> amarillo
manzana --> verde

Obviamente, no es necesaria la asignación previa de la vista. Tambień podrías haber escrito directamente esto:

>>> for fruta, color in macedonia.items():
  print(fruta, '-->', color)

Recuerda: las tres vistas son dinámicas y reflejan la situación actual del objeto.

Vamos a eliminar la fresa de la macedonia:

>>> del macedonia['fresa']
>>> macedonia
{'plátano': 'amarillo', 'manzana': 'verde'}

Y comprobemos nuestras preciosas vistas:

>>> macedonia
{'plátano': 'amarillo', 'manzana': 'verde'}
>>> frutas
dict_keys(['plátano', 'manzana'])
>>> colores
dict_values(['amarillo', 'verde'])
>>> elementos
dict_items([('plátano', 'amarillo'), ('manzana', 'verde')])

Pero, aunque el resultado sea el esperado, coincidirás conmigo que una macedonia sin fresas no es macedonia ni nada…

Javier Montero Gabarró


Python: Recorriendo un diccionario de principio a fin


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

23 opiniones en “Python: Recorriendo un diccionario de principio a fin”

  1. HOLA CREO QUE PYTHON TIENE UN ERROR EN LOS DICCIONARIOS, PUES AL ITERAR SOBRE LAS CLAVES VALOR, NO SE OBTIENE EL MISMO ORDEN EN EL QUE SE LO CREO, CREO QUE ES ALGO MUY GRAVE, ESPERO RESPUESTAS

    1. Qué tal!
      No, no se trata de ningún error. Los diccionarios, al igual que los conjuntos, no son estructuras ordenadas, al contrario que las listas y las tuplas.
      No obstante, existe el tipo OrderedDict, que sirve para implementar orden en un diccionario.
      Saludos

  2. Noche desvelada y llego por casualidad a tu blog. Que suerte tuve!
    Un link me llevó a otro desde listas por comprensión y llegué aquí.
    Hace poco arranqué con Python, viniendo de PHP, y muchas cosas que encontraba no terminaban de cerrarme.
    Ahora ya la cosa va tomando forma
    Muy claras y concisas tus explicaciones!
    Saludos y felicitaciones por el buen material de tu blog!

    1. Genial, me pasó casi igual (vengo de C/C++/Java no de PHP) y bueno, 10 meses después. Gracias Javier por tu blog.

  3. ciertamente una macedonia sin fresas no mola nada! gracias por la receta y por los tips sobre commo recorrer objetos en python 🙂

  4. Hola tengo una bronca…. no sé a que se deba…. que interprete usas??? porque en el interprete de linux tengo que volver a invocar la Keys… ya he visto que la sintaxis puede variar y son equivalentess… pero no me respetaaaa y lo tengo que volver a invocar

    1. Qué tal!
      Por la fecha en la que se escribió el artículo, debía de estar usando Python 3.2. Trabajo indistintamente tanto en máquinas Linux como Windows.
      ¿Puedes enviarme un ejemplo de código que no te funcione como esperas?
      Saludos

  5. Hola Javier, sabes si existe la posibilidad de recorrer solo parte de un diccionario? Por ejemplo de un diccionario con 5 elementos recorrer del 2 al 4.

    Gracias de antemano

    1. Qué tal, Gonzalo:
      Pero, ¿cuál es el segundo elemento y cuál el cuarto?
      No, me temo que no existe un segundo ni cuarto elemento, pues los diccionarios no son estructuras ordenadas. Internamente Python maneja funciones hash para su gestión, pero eso es ajeno al usuario.
      Saludos

  6. Hola, tengo una duda, y no he podido resolverla en los foros. Tengo dos diccionarios en el cual tengo una clave y varios valores para ella en una lista, entre los valores esta la descripción de un producto y su precio. Lo que debo hacer es unir ambos diccionarios. Sin embargo, hay algunas situaciones en que se solapa la descripción del producto y por lo tanto el nuevo diccionario sólo incluye la información de una de las claves. ¿Cómo puedo hacer para comparar los precios y que mi diccionario incluya la clave con el precio mas bajo en este nuevo diccionario?.

    Muchas gracias!,
    Paula

    1. Qué tal Paula:

      Es una cuestión de fabricarte tu propio fusionador, pues update sobreescribe sin más miramientos. Observa la técnica empleada:

      a = {'ref01': ['pepino', 5], 'ref02': ['pimiento', 2]}
      b = {'ref02':['pimiento', 1], 'ref03':['cebolla', 4]}
      
      for clave in b.keys():
          if clave in a.keys():
              if b[clave][1] < a[clave][1]:
                  a[clave] = b[clave]
          else:
              a[clave] = b[clave]

      >>> a
      {'ref02': ['pimiento', 1], 'ref01': ['pepino', 5], 'ref03': ['cebolla', 4]}

      Creo que el código es autoexplicativo, pero no dudes en preguntar si algo no entiendes.

      Saludos

  7. Tengo este enunciado. Como lo hago con diccionarios.
    Crea un diccionario con 100 artículos (A elegir, da igual la referencia) como claves y 10 precios decimales como valores.

    Recorre ese diccionario e imprime por consola los artículos y sus respectivos precios

    Aplica un 10% de descuento a cada uno de los artículos e imprímelo por consola.

    Localiza los artículos que después del descuento tienen un precio inferior a 1 €, y haz que su precio mínimo sea de exactamente 1.12€ (Por ejemplo, si los pepinos valían 1€, después del descuento se quedan a 0.90€, así que su precio final que muestres por consola debe ser 1.12€ en su lugar).

    1. Es un problema sencillo cuya resolución te enseñará bastante. Enfréntate a él paso a paso tratando de despejar todas las dudas concretas conforme te vayan surgiendo. Es la única manera de aprender a programar, superando obstáculos uno a uno.
      Ánimo, seguro que lo consigues.
      Saludos

  8. Hola, muy buen articulo.
    veras, estoy tomando un curso de python para mi carrera y me piden un programa basico que use funciones y diccionarios para cifrar mensajes, usando por ejemplo la clave ‘murcielago’, la cual es:
    m vale 0
    u vale 1
    r vale 2
    c vale 3
    i vale 4
    e vale 5
    l vale 6
    a vale 7
    g vale 8
    o vale 9
    pi problema es que no se como definir la funcion que me transforme cada caracter de mi mensaje que se pueda cambiar usando la clave, pero leyendo tu articulo, entiendo que tendria que usar estos comandos para recorrer el diccionario en el que esta la clave.
    No se si puedas iluminar algo mi camino con este problema.

    Saludos desde México.

  9. Sos un genio, un «capo» como decimos en Argentina, vengo del Java’s World donde estoy desde hace poco mas de 15 años. Gracias por hacer mas simple el aprender python.
    Tengo un problemilla, mira, debo recorrer una lista, integrada por diccionarios y debo concatenar unos valores del mismo.
    Eso seria algo asi:
    ej =[
    {«nombre» : «Pepito»,»deuda» : 100,»acreedor»:»Jorge»},{«nombre» : «Cachito»,»deuda» : 150,»acreedor»:»Mario»},{«nombre» : «Juan»,»deuda» : 1000,»acreedor»:»Gustavo»}]
    imprimir deuda total y los acreedores, separados por «|»… Como lo resuelves? Gracias

  10. Hola,
    tengo una diccionario en un diccionario..como apenas se manejarlos , tengo una duda :
    {‘ P01’: {(1, 1): 52, (3, 2): 52, (2, 2): 52},
    ‘ P02’: {(1, 1): 1, (1, 2): 20, (2, 1): 4},
    ‘ P03’: {(1, 1): 7, (1, 2): 14, (2, 3): 100},
    ‘ P05’: {(2, 3): 20},
    ‘ P04’: {(2, 1): 4}}

    Necesito sacar los valores que es para cada producto , es decir,
    ‘P01’ -> 156(52+52+52)
    ‘P02’ -> 25(1+20+4)
    ‘P03’ -> 121
    ‘P04’ -> 20
    ‘P05’ -> 4

    No necesito las claves, tan solo la suma de los valores del diccionario de dentro.
    Un saludo y gracias de antemano!

    1. Qué tal, Susana:
      Vamos a crear una lista que va a contener las sumas buscadas. Comenzamos creándola vacía y luego vamos agregando los resultados de cada clave. El único misterio del problema es no perderse a la hora de sumergirte en los diccionarios anidados. Sea dicc tu diccionario:

      sumas = []
      
      for key in dicc:
          suma = 0
          for subkey in dicc[key]:
              suma += dicc[key][subkey]
          sumas.append(suma)

      Y ya lo tienes en la lista sumas.

      Saludos

Deja un comentario

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies