Comprensión de los diccionarios en Python 3

Introducción

El diccionario es un tipo de mapeo incorporado en Python. Los diccionarios mapean claves a valores y estos pares clave-valor proporcionan una forma útil de almacenar datos en Python.

Normalmente se utilizan para mantener datos relacionados, como la información contenida en un ID o un perfil de usuario, los diccionarios se construyen con llaves en ambos lados { }.

Información: Para seguir los ejemplos de código en este tutorial, abre una shell interactiva de Python en tu sistema local ejecutando el comando python3. Luego puedes copiar, pegar o editar los ejemplos añadiéndolos después del indicador >>>.

A dictionary looks like this:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

Además de las llaves, también hay dos puntos (:) en todo el diccionario.

Las palabras a la izquierda de los dos puntos son las claves. Las claves pueden estar compuestas por cualquier tipo de datos inmutable. Las claves en el diccionario anterior son:

  • 'nombredeusuario'
  • 'enlinea'
  • 'seguidores'

Cada una de las claves en el ejemplo anterior son valores de cadena.

Las palabras a la derecha de los dos puntos son los valores. Los valores pueden estar compuestos por cualquier tipo de datos. Los valores en el diccionario anterior son:

  • 'sammy-shark'
  • Verdadero
  • 987

Cada uno de estos valores es una cadena, un booleano o un entero.

Vamos a imprimir el diccionario sammy:

print(sammy)
Output
{'username': 'sammy-shark', 'followers': 987, 'online': True}

Al observar la salida, el orden de los pares clave-valor puede haber cambiado. En Python versión 3.5 y anteriores, el tipo de dato diccionario no está ordenado. Sin embargo, en Python versión 3.6 y posteriores, el tipo de dato diccionario sigue estando ordenado. Independientemente de si el diccionario está ordenado o no, los pares clave-valor permanecerán intactos, lo que nos permite acceder a los datos en función de su significado relacional.

Prerrequisitos

Deberías tener Python 3 instalado y un entorno de programación configurado en tu computadora o servidor. Si no tienes configurado un entorno de programación, puedes consultar las guías de instalación y configuración para un entorno de programación local o para un entorno de programación en tu servidor adecuado para tu sistema operativo (Ubuntu, CentOS, Debian, etc.).

Accediendo a los Elementos del Diccionario

Podemos llamar a los valores de un diccionario haciendo referencia a las claves relacionadas.

Accediendo a los Elementos de Datos con Claves

Debido a que los diccionarios ofrecen pares clave-valor para almacenar datos, pueden ser elementos importantes en tu programa de Python.

Si queremos aislar el nombre de usuario de Sammy, podemos hacerlo llamando a sammy['username']. Vamos a imprimir eso:

print(sammy['username'])
Output
sammy-shark

Los diccionarios se comportan como una base de datos en el sentido de que, en lugar de llamar a un entero para obtener un valor de índice particular como lo harías con una lista, asignas un valor a una clave y puedes llamar a esa clave para obtener su valor relacionado.

Al invocar la clave 'username' recibimos el valor de esa clave, que es 'sammy-shark'.

Los valores restantes en el diccionario sammy pueden ser llamados de manera similar utilizando el mismo formato:

sammy['followers']
# Devuelve 987

sammy['online']
# Devuelve True

Al hacer uso de los pares clave-valor de los diccionarios, podemos hacer referencia a las claves para recuperar los valores.

Usando Métodos para Acceder a Elementos

Además de usar claves para acceder a valores, también podemos trabajar con algunos métodos integrados:

  • dict.keys() aisla las claves
  • dict.values() aisla los valores
  • dict.items() devuelve elementos en un formato de lista de pares de tuplas (clave, valor)

Para devolver las claves, usaríamos el método dict.keys(). En nuestro ejemplo, eso usaría el nombre de la variable y sería sammy.keys(). Pasemos eso a un método print() y veamos la salida:

print(sammy.keys())
Output
dict_keys(['followers', 'username', 'online'])

Recibimos una salida que coloca las claves dentro de un objeto de vista iterable de la clase dict_keys. Luego, las claves se imprimen en un formato de lista.

Este método se puede usar para consultar en diccionarios. Por ejemplo, podemos echar un vistazo a las claves comunes compartidas entre dos estructuras de datos de diccionario:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

for common_key in sammy.keys() & jesse.keys():
    print(sammy[common_key], jesse[common_key])

El diccionario sammy y el diccionario jesse son cada uno un diccionario de perfil de usuario.

Sus perfiles tienen claves diferentes, sin embargo, porque Sammy tiene un perfil social con seguidores asociados, y Jesse tiene un perfil de juegos con puntos asociados. Las 2 claves que tienen en común son username y el estado online, que podemos encontrar cuando ejecutamos este pequeño programa:

Output
sammy-shark JOctopus True False

Podríamos ciertamente mejorar el programa para hacer que la salida sea más legible para el usuario, pero esto ilustra que dict.keys() se puede usar para verificar en varios diccionarios qué comparten en común o no. Esto es especialmente útil para diccionarios grandes.

De manera similar, podemos usar el método dict.values() para consultar los valores en el diccionario sammy, que se construiría como sammy.values(). Vamos a imprimir esos valores:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

print(sammy.values())
Output
dict_values([True, 'sammy-shark', 987])

Ambos métodos keys() y values() devuelven listas no ordenadas de las claves y valores presentes en el diccionario sammy con los objetos de vista de dict_keys y dict_values respectivamente.

Si estamos interesados en todos los elementos de un diccionario, podemos acceder a ellos con el método items():

print(sammy.items())
Output
dict_items([('online', True), ('username', 'sammy-shark'), ('followers', 987)])

El formato devuelto de esto es una lista compuesta de pares de tuplas (clave, valor) con el objeto de vista dict_items.

Podemos iterar sobre el formato de lista devuelto con un bucle for. Por ejemplo, podemos imprimir cada una de las claves y valores de un diccionario dado, y luego hacerlo más legible para los humanos agregando una cadena:

for key, value in sammy.items():
    print(key, 'is the key for the value', value)
Output
online is the key for the value True followers is the key for the value 987 username is the key for the value sammy-shark

El bucle for anterior iteró sobre los elementos dentro del diccionario sammy e imprimió las claves y valores línea por línea, con información para hacerlo más fácil de entender para los humanos.

Podemos usar métodos integrados para acceder a elementos, valores y claves de estructuras de datos de diccionario.

Modificación de Diccionarios

Los diccionarios son una estructura de datos mutable, por lo que puedes modificarlos. En esta sección, veremos cómo agregar y eliminar elementos de diccionarios.

Agregando y Cambiando Elementos de un Diccionario

Sin usar un método o función, puedes agregar pares clave-valor a diccionarios utilizando la siguiente sintaxis:

dict[key] = value

Vamos a ver cómo funciona esto en la práctica agregando un par clave-valor a un diccionario llamado usernames:

usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

usernames['Drew'] = 'squidly'

print(usernames)
Output
{'Drew': 'squidly', 'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

Ahora vemos que el diccionario ha sido actualizado con el par clave-valor 'Drew': 'squidly'. Debido a que los diccionarios pueden ser desordenados, este par puede aparecer en cualquier lugar en la salida del diccionario. Si usamos el diccionario usernames más adelante en nuestro archivo de programa, incluirá el par clave-valor adicional.

Además, esta sintaxis se puede usar para modificar el valor asignado a una clave. En este caso, haremos referencia a una clave existente y le asignaremos un valor diferente.

Consideremos un diccionario drew que es uno de los usuarios en una red dada. Diremos que este usuario obtuvo un aumento en seguidores hoy, por lo que necesitamos actualizar el valor entero pasado a la clave 'followers'. Usaremos la función print() para verificar que el diccionario fue modificado.

drew = {'username': 'squidly', 'online': True, 'followers': 305}

drew['followers'] = 342

print(drew)
Output
{'username': 'squidly', 'followers': 342, 'online': True}

En la salida, vemos que el número de seguidores aumentó desde el valor entero de 305 a 342.

Podemos usar este método para agregar pares clave-valor a diccionarios con entrada de usuario. Escribamos un programa rápido, usernames.py, que se ejecute en la línea de comandos y permita la entrada del usuario para agregar más nombres y nombres de usuario asociados:

usernames.py
# Define el diccionario original
usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

# Configura un bucle while para iterar
while True:

    # Solicita al usuario que ingrese un nombre
    print('Enter a name:')

    # Asigna a la variable nombre
    name = input()

    # Comprueba si el nombre está en el diccionario e imprime comentarios
    if name in usernames:
        print(usernames[name] + ' is the username of ' + name)

    # Si el nombre no está en el diccionario...
    else:

        # Proporciona comentarios        
        print('I don\'t have ' + name + '\'s username, what is it?')

        # Ingresa un nuevo nombre de usuario para el nombre asociado
        username = input()

        # Asigna el valor del nombre de usuario a la clave nombre
        usernames[name] = username

        # Imprime comentarios de que los datos fueron actualizados
        print('Data updated.')

Ejecutemos el programa en la línea de comandos:

  1. python usernames.py

Cuando ejecutamos el programa, obtendremos algo como la siguiente salida:

Output
Enter a name: Sammy sammy-shark is the username of Sammy Enter a name: Jesse I don't have Jesse's username, what is it? JOctopus Data updated. Enter a name:

Cuando hayamos terminado de probar el programa, podemos presionar CTRL + C para salir del programa. Puedes configurar un disparador para salir del programa (como escribir la letra q) con una declaración condicional para mejorar el código.

Esto muestra cómo puedes modificar diccionarios de forma interactiva. Con este programa en particular, tan pronto como salgas del programa con CTRL + C, perderás todos tus datos a menos que implementes una forma de manejar la lectura y escritura de archivos.

También podemos agregar y modificar diccionarios usando el método dict.update(). Esto difiere del método append() disponible en listas.

En el diccionario jesse a continuación, agreguemos la clave 'followers' y asignémosle un valor entero con jesse.update(). Después de eso, imprimamos() el diccionario actualizado.

jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

jesse.update({'followers': 481})

print(jesse)
Output
{'followers': 481, 'username': 'JOctopus', 'points': 723, 'online': False}

A partir de la salida, podemos ver que hemos agregado con éxito el par clave-valor 'followers': 481 al diccionario jesse.

También podemos usar el método dict.update() para modificar un par clave-valor existente reemplazando un valor dado por una clave específica.

Vamos a cambiar el estado en línea de Sammy de True a False en el diccionario sammy:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

sammy.update({'online': False})

print(sammy)
Output
{'username': 'sammy-shark', 'followers': 987, 'online': False}

La línea sammy.update({'online': False}) hace referencia a la clave existente 'online' y modifica su valor booleano de True a False. Cuando llamamos a print() el diccionario, vemos que se realiza la actualización en la salida.

Para agregar elementos a diccionarios o modificar valores, podemos usar tanto la sintaxis dict[key] = value como el método dict.update().

Eliminando Elementos del Diccionario

Así como se pueden agregar pares clave-valor y cambiar valores dentro del tipo de datos diccionario, también se pueden eliminar elementos dentro de un diccionario.

Para eliminar un par clave-valor de un diccionario, usaremos la siguiente sintaxis:

del dict[key]

Vamos a tomar el diccionario jesse que representa a uno de los usuarios. Diremos que Jesse ya no está utilizando la plataforma en línea para jugar juegos, así que eliminaremos el elemento asociado con la clave 'points'. Luego, imprimiremos el diccionario para confirmar que se eliminó el elemento:

jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}

del jesse['points']

print(jesse)
Output
{'online': False, 'username': 'JOctopus', 'followers': 481}

La línea del jesse['points'] elimina el par clave-valor 'points': 723 del diccionario jesse.

Si queremos vaciar un diccionario de todos sus valores, podemos hacerlo con el método dict.clear(). Esto mantendrá un diccionario dado en caso de que necesitemos usarlo más tarde en el programa, pero ya no contendrá ningún elemento.

Vamos a eliminar todos los elementos dentro del diccionario jesse:

jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}

jesse.clear()

print(jesse)
Output
{}

La salida muestra que ahora tenemos un diccionario vacío sin pares clave-valor.

Si ya no necesitamos un diccionario específico, podemos usar del para deshacernos de él completamente:

del jesse

print(jesse)

Cuando ejecutamos una llamada a print() después de eliminar el diccionario jesse, recibiremos el siguiente error:

Output
... NameError: name 'jesse' is not defined

Como los diccionarios son tipos de datos mutables, se pueden agregar, modificar y eliminar elementos y limpiarlos.

Conclusión

Este tutorial pasó por la estructura de datos de diccionario en Python. Los diccionarios están compuestos por pares clave-valor y proporcionan una forma de almacenar datos sin depender de la indexación. Esto nos permite recuperar valores basados en su significado y relación con otros tipos de datos.

Desde aquí, puedes aprender más sobre otros tipos de datos en nuestro tutorial “Entendiendo los Tipos de Datos” (Understanding Data Types).

Puedes ver el tipo de datos diccionario usado en proyectos de programación como web scraping con Scrapy.

Source:
https://www.digitalocean.com/community/tutorials/understanding-dictionaries-in-python-3