Iterar a través de un diccionario#

Un diccionario es una estructura de datos y, como tal, puede contener una cantidad sumamente grande de elementos. En cuanto mayor sea el tamaño del diccionario, las operaciones para acceder a los valores deben ser un poco más complejas. En este capítulo veremos cómo iterar a través de un diccionario.

Para estos ejercicios, crearemos un diccionario a partir de la siguiente bibliografía:

bibliografia = {
    "001": {
        "tipo": "libro",
        "autor": [{"nombre": "Martin", "apellido": "Heidegger"}],
        "titulo": "Ser y tiempo",
        "editorial": "Trotta",
        "lugar": "Madrid",
        "fecha": 2003
    },
    "002": {
        "tipo": "libro",
        "autor": [{"nombre": "Fernand", "apellido": "Braudel"}],
        "titulo": "El Mediterráneo y el mundo mediterráneo en la época de Felipe II",
        "editorial": "Fondo de Cultura Económica",
        "lugar": "México",
        "fecha": 2022,
        "edicion": "tercera"
    },
    "003": {
        "tipo": "libro",
        "autor": [{"nombre": "Hans-Georg", "apellido": "Gadamer"}],
        "titulo": "Verdad y método I: fundamentos de una hermenéutica filosófica",
        "editorial": "Sígueme",
        "lugar": "Salamanca",
        "fecha": 1996
    },
    "004": {
        "tipo": "libro",
        "autor": [{"nombre": "Giorgio", "apellido": "Agamben"}],
        "titulo": "Estado de excepción",
        "editorial": "Adriana Hidalgo Editora",
        "lugar": "Buenos Aires",
        "fecha": 2010
    },
    "005": {
        "tipo": "libro",
        "autor": [{"nombre": "Ludwig", "apellido": "Wittgenstein"}],
        "titulo": "Zettel",
        "editorial": "University of California Press",
        "lugar": "Berkeley",
        "fecha": 1970,
        "idioma": "en"
    }
}
    

Como verás, la estructura diccionario contiene una serie de claves propias de un conjunto bibliográfico: tipo, autor, título, editorial, lugar, fecha, edición y idioma. No todos los elementos tienen todas las claves, por lo que debemos considerar que el campo está vacío si no existe.

Iterar a través pares clave-valor#

Para iterar a través de un diccionario, podemos utilizar el método items(). Este método devuelve una lista de tuplas, donde cada tupla contiene una clave y su valor correspondiente.

for clave, valor in bibliografia.items():
    print(f"Clave: {clave} :: Valor: {valor}")
Clave: 001 :: Valor: {'tipo': 'libro', 'autor': [{'nombre': 'Martin', 'apellido': 'Heidegger'}], 'titulo': 'Ser y tiempo', 'editorial': 'Trotta', 'lugar': 'Madrid', 'fecha': 2003}
Clave: 002 :: Valor: {'tipo': 'libro', 'autor': [{'nombre': 'Fernand', 'apellido': 'Braudel'}], 'titulo': 'El Mediterráneo y el mundo mediterráneo en la época de Felipe II', 'editorial': 'Fondo de Cultura Económica', 'lugar': 'México', 'fecha': 2022, 'edicion': 'tercera'}
Clave: 003 :: Valor: {'tipo': 'libro', 'autor': [{'nombre': 'Hans-Georg', 'apellido': 'Gadamer'}], 'titulo': 'Verdad y método I: fundamentos de una hermenéutica filosófica', 'editorial': 'Sígueme', 'lugar': 'Salamanca', 'fecha': 1996}
Clave: 004 :: Valor: {'tipo': 'libro', 'autor': [{'nombre': 'Giorgio', 'apellido': 'Agamben'}], 'titulo': 'Estado de excepción', 'editorial': 'Adriana Hidalgo Editora', 'lugar': 'Buenos Aires', 'fecha': 2010}
Clave: 005 :: Valor: {'tipo': 'libro', 'autor': [{'nombre': 'Ludwig', 'apellido': 'Wittgenstein'}], 'titulo': 'Zettel', 'editorial': 'University of California Press', 'lugar': 'Berkeley', 'fecha': 1970, 'idioma': 'en'}

En este caso la clave es el identificador de cada elemento bibliográfico (por ejemplo, 001), y el valor es el diccionario que contiene los campos de cada libro.

Iterar sobre este diccionario sería útil para, por ejemplo, obtener un listado de todos los libros que se encuentran en la bibliografía. Para ello, podemos utilizar la clave tipo para filtrar los elementos que sean libros.

print("        Listado de libros".upper())

for clave, valor in bibliografia.items():
    if valor["tipo"] == "libro":
        print(f"""
        Identificador: {clave}
        Título: {valor["titulo"]}
        Autor: {valor["autor"][0]["apellido"]}, {valor["autor"][0]["nombre"]}
        Editorial: {valor["editorial"]}
        Lugar: {valor["lugar"]}
        Fecha: {valor["fecha"]}
        """)
        LISTADO DE LIBROS

        Identificador: 001
        Título: Ser y tiempo
        Autor: Heidegger, Martin
        Editorial: Trotta
        Lugar: Madrid
        Fecha: 2003
        

        Identificador: 002
        Título: El Mediterráneo y el mundo mediterráneo en la época de Felipe II
        Autor: Braudel, Fernand
        Editorial: Fondo de Cultura Económica
        Lugar: México
        Fecha: 2022
        

        Identificador: 003
        Título: Verdad y método I: fundamentos de una hermenéutica filosófica
        Autor: Gadamer, Hans-Georg
        Editorial: Sígueme
        Lugar: Salamanca
        Fecha: 1996
        

        Identificador: 004
        Título: Estado de excepción
        Autor: Agamben, Giorgio
        Editorial: Adriana Hidalgo Editora
        Lugar: Buenos Aires
        Fecha: 2010
        

        Identificador: 005
        Título: Zettel
        Autor: Wittgenstein, Ludwig
        Editorial: University of California Press
        Lugar: Berkeley
        Fecha: 1970
        

Iterar a través de las claves#

Si queremos iterar a través de las claves de un diccionario, podemos utilizar el método keys().

for clave in bibliografia.keys():
    print(f"Clave: {clave}")
Clave: 001
Clave: 002
Clave: 003
Clave: 004
Clave: 005

De hecho, este es el comportamiento predeterminado al iterar sobre un diccionario, de tal manera que si no utilizamos la función keys(), el resultado será el mismo.

for clave in bibliografia:
    print(f"Clave: {clave}")
Clave: 001
Clave: 002
Clave: 003
Clave: 004
Clave: 005

Usar o no la función keys() es un asunto de legibilidad.

La utilidad de iterar sobre las claves está en el hecho de que podemos utilizarlas para acceder a los valores correspondientes, por ejemplo:

for clave in bibliografia.keys():
    print(f"ID: {clave}\nTítulo: {bibliografia[clave]['titulo']}")
ID: 001
Título: Ser y tiempo
ID: 002
Título: El Mediterráneo y el mundo mediterráneo en la época de Felipe II
ID: 003
Título: Verdad y método I: fundamentos de una hermenéutica filosófica
ID: 004
Título: Estado de excepción
ID: 005
Título: Zettel

También, debido a que el método keys() devuelve una lista de claves, podemos aplicar cualquiera de los métodos de listas que hemos visto, por ejemplo, determinar si una clave está en el diccionario:

if "006" not in bibliografia.keys():
    print("La clave 006 no existe en el diccionario")
La clave 006 no existe en el diccionario

Agregar elementos de una lista a un diccionario#

Ahora, veamos cómo podemos agregar elementos de una lista a un diccionario. Por ejemplo, si tenemos una lista similar a la de los ejercicios anteriores:

lista_bibliografia = [
    "Edgar Alan Poe; Cuentos completos; 2019; Alianza Editorial",
    "David Hume; Del conocimiento; 1984; Aguilar",
    "Ludwig Wittgenstein; Tractatus Logico-Philosophicus; 2017; Tecnos",
    "Francois Hartog; Cronos; 2022; Siglo XXI",
    "David Spiegelhalter; The art of statistics; 2021; Basic Books"
]

Podemos crear agregar estos elementos al diccionario bibliografia de la siguiente manera:

for elemento in lista_bibliografia:
    # obtener la última clave del diccionario, convertirla a entero y sumarle 1
    clave = int(list(bibliografia.keys())[-1]) + 1
    # convertir la clave a string y darle el formato de 3 dígitos
    clave = str(clave).zfill(3)
    # agregar el elemento a la bibliografía
    bibliografia[clave] = {
        "tipo": "libro",
        "autor": [{"nombre": elemento.split(";")[0].split(" ")[0], "apellido": elemento.split(";")[0].split(" ")[1]}],
        "titulo": elemento.split(";")[1],
        "editorial": elemento.split(";")[3],
        "fecha": int(elemento.split(";")[2]),
        "lugar": "" # dejamos vacío el campo lugar para evitar errores en la iteración
    }

Podemos iterar sobre los valores para comprobar que se han agregado correctamente:

print("        Listado de libros".upper())
for clave, valor in bibliografia.items():
    if valor["tipo"] == "libro":
        print(f"""
        Identificador: {clave}
        Título: {valor["titulo"]}
        Autor: {valor["autor"][0]["apellido"]}, {valor["autor"][0]["nombre"]}
        Editorial: {valor["editorial"]}
        Lugar: {valor["lugar"]}
        Fecha: {valor["fecha"]}
        """)
        LISTADO DE LIBROS

        Identificador: 001
        Título: Ser y tiempo
        Autor: Heidegger, Martin
        Editorial: Trotta
        Lugar: Madrid
        Fecha: 2003
        

        Identificador: 002
        Título: El Mediterráneo y el mundo mediterráneo en la época de Felipe II
        Autor: Braudel, Fernand
        Editorial: Fondo de Cultura Económica
        Lugar: México
        Fecha: 2022
        

        Identificador: 003
        Título: Verdad y método I: fundamentos de una hermenéutica filosófica
        Autor: Gadamer, Hans-Georg
        Editorial: Sígueme
        Lugar: Salamanca
        Fecha: 1996
        

        Identificador: 004
        Título: Estado de excepción
        Autor: Agamben, Giorgio
        Editorial: Adriana Hidalgo Editora
        Lugar: Buenos Aires
        Fecha: 2010
        

        Identificador: 005
        Título: Zettel
        Autor: Wittgenstein, Ludwig
        Editorial: University of California Press
        Lugar: Berkeley
        Fecha: 1970
        

        Identificador: 006
        Título:  Cuentos completos
        Autor: Alan, Edgar
        Editorial:  Alianza Editorial
        Lugar: 
        Fecha: 2019
        

        Identificador: 007
        Título:  Del conocimiento
        Autor: Hume, David
        Editorial:  Aguilar
        Lugar: 
        Fecha: 1984
        

        Identificador: 008
        Título:  Tractatus Logico-Philosophicus
        Autor: Wittgenstein, Ludwig
        Editorial:  Tecnos
        Lugar: 
        Fecha: 2017
        

        Identificador: 009
        Título:  Cronos
        Autor: Hartog, Francois
        Editorial:  Siglo XXI
        Lugar: 
        Fecha: 2022
        

        Identificador: 010
        Título:  The art of statistics
        Autor: Spiegelhalter, David
        Editorial:  Basic Books
        Lugar: 
        Fecha: 2021
        

Agregar valores a través de diccionarios#

Ahora, supongamos que queremos corregir el valor vacío del campo lugar para los libros que hemos agregado. Para ello, podemos crear un diccionario con los valores correspondientes:

lugares = {
    "006": "Madrid",
    "007": "Madrid",
    "008": "Madrid",
    "009": "México",
    "010": "Nueva York"
}

Y luego, iterar sobre el diccionario lugares para agregar los valores correspondientes al diccionario bibliografia:

for clave, valor in lugares.items():
    bibliografia[clave]["lugar"] = valor

Nota que lo que hicimos en esta operación fue tomar el valor coincidente en ambos diccionarios (la clave) y tomar el único valor que tiene el diccionario ``lugarespara esa clave. Debido a que la coincidencia es la clave, podemos utilizarla para acceder al valor correspondiente en el diccionariobibliografiay agregar el valor correspondiente a la clave anidadalugar`.

Finalmente, podemos volver a iterar sobre el diccionario bibliografia para comprobar que los valores se han agregado correctamente:

print("        Listado de libros".upper())
for clave, valor in bibliografia.items():
    if valor["tipo"] == "libro":
        print(f"""
        Identificador: {clave}
        Título: {valor["titulo"]}
        Autor: {valor["autor"][0]["apellido"]}, {valor["autor"][0]["nombre"]}
        Editorial: {valor["editorial"]}
        Lugar: {valor["lugar"]}
        Fecha: {valor["fecha"]}
        """)
        LISTADO DE LIBROS

        Identificador: 001
        Título: Ser y tiempo
        Autor: Heidegger, Martin
        Editorial: Trotta
        Lugar: Madrid
        Fecha: 2003
        

        Identificador: 002
        Título: El Mediterráneo y el mundo mediterráneo en la época de Felipe II
        Autor: Braudel, Fernand
        Editorial: Fondo de Cultura Económica
        Lugar: México
        Fecha: 2022
        

        Identificador: 003
        Título: Verdad y método I: fundamentos de una hermenéutica filosófica
        Autor: Gadamer, Hans-Georg
        Editorial: Sígueme
        Lugar: Salamanca
        Fecha: 1996
        

        Identificador: 004
        Título: Estado de excepción
        Autor: Agamben, Giorgio
        Editorial: Adriana Hidalgo Editora
        Lugar: Buenos Aires
        Fecha: 2010
        

        Identificador: 005
        Título: Zettel
        Autor: Wittgenstein, Ludwig
        Editorial: University of California Press
        Lugar: Berkeley
        Fecha: 1970
        

        Identificador: 006
        Título:  Cuentos completos
        Autor: Alan, Edgar
        Editorial:  Alianza Editorial
        Lugar: Madrid
        Fecha: 2019
        

        Identificador: 007
        Título:  Del conocimiento
        Autor: Hume, David
        Editorial:  Aguilar
        Lugar: Madrid
        Fecha: 1984
        

        Identificador: 008
        Título:  Tractatus Logico-Philosophicus
        Autor: Wittgenstein, Ludwig
        Editorial:  Tecnos
        Lugar: Madrid
        Fecha: 2017
        

        Identificador: 009
        Título:  Cronos
        Autor: Hartog, Francois
        Editorial:  Siglo XXI
        Lugar: México
        Fecha: 2022
        

        Identificador: 010
        Título:  The art of statistics
        Autor: Spiegelhalter, David
        Editorial:  Basic Books
        Lugar: Nueva York
        Fecha: 2021
        

Síntesis#

Como habrás visto, los diccionarios son estructuras de datos que hacen muy eficiente la búsqueda y almacenamiento de información. En estos ejercicios todavía trabajamos con datos efímeros (se agregan, procesan y finalizan con el mismo programa), pero esta misma estructura se puede utilizar para almacenar información en archivos de texto (JSON) o bases de datos, y luego recuperarla para procesarla. Es por esta razón que es fundamental conocer y dominar los diccionarios.