11. Diccionarios

Un Diccionario ("dict") es una estructura de datos versatil en Python, que permite almacenar cualquier tipo de valor; enteros, cadenas, listas e incluso otras funciones. Los valores almacenados son identificados a través de una clave ("Key") y que por condición esperable debiese ser única.

Sintaxis

diccionario = { key : 'value'}

Ejemplo

diccionario = {1: 'uno',
               2: 'dos',
               3: 'tres',
               4: 'cuatro'}

En el ejemplo denota que son las llaves ({}) las que se utilizan para definir un diccionario y en su interior y en primer lugar existe "key" (1) de tipo entero, con un "valor" asociado a 'uno' de tipo string.

11.1. Definir un diccionario

Para crear un diccionario se puede realizar de la siguiente manera

persona = {}

En caso de querer definir un diccionario con valores por defecto podemos utilizar la siguiente sintaxis:

persona = {'nombre': 'Pepito',
           'apellido': 'Perez',
           'ciudad': 'Curicó'
          }
print(persona)

La salida esperada es

{'nombre': 'Pepito', 'apellido': 'Perez', 'ciudad': 'Curicó'}

11.2. Agrega una nueva key al diccionario

Es posible agregar una key al diccionario ya definido realizando la siguiente declaración

diccionario[key] = valor

Ejemplo:

persona['pais'] = 'Chile'
print(persona)

Se referencia la variable persona previamente definida y que es de tipo diccionario (persona). Entre corchetes se inserta el nombre de la key ("pais") y también se le asigna el valor que para el caso es el string de "Chile".

La salida obtenida para el ejemplo realizado será

{'nombre': 'Pepito', 'apellido': 'Perez', 'ciudad': 'Curicó', 'pais': 'Chile'}

11.3. Acceder a los valores de un diccionario

Para acceder a los valores dentro del diccionario existen dos maneras, usando el méotodo "get" o en su defecto usar corchetes.

nombre = persona.get('nombre')
print("El nombre de la persona es", nombre)
nombre = persona['nombre']
print("El nombre de la persona es", nombre)

11.4. Editar valores de una diccionario

Para editar el valor de un diccionario es prácticamente del mismo modo que la asignación, pues se reemplazará el valor de una key ya existente

Un ejemplo básico para reemplazar el valor de la key "apellido" sería:

persona['apellido'] = 'Pereira'
print(persona)

La salida esperada es:

{'nombre': 'Pepito', 'apellido': 'Pereira', 'ciudad': 'Curicó', 'pais': 'Chile'}

11.5. Eliminar valores de un diccionario

Si se desea eliminar una clave, puede hacerlo con la instrucción del siguiendo la siguiente sintaxis

del diccionario['key']
del persona['pais']
print(persona)

Ahora el diccionario quedaría del siguiente modo:

{'nombre': 'Pepito', 'apellido': 'Pereira', 'ciudad': 'Curicó'}

11.6. Útiles sobre diccionarios

Algunas recomendaciones sobre diccionarios:

  • Por definición, un diccionario no tiene orden explicito, por lo que la recomendación es siempre crear una rutina en caso de requerirlo:

def ordena (dictionary):
    return "{" + ", ".join("%r: %r"%(key,
                                     dictionary[key])
                            for key in sorted (dictionary))+"}"
dict = ordena(dict)
print(dict)

La salida es un diccionario ordenado por keys

"{'apellido': 'Pereira', 'ciudad': 'Curicó', 'nombre': 'Pepito'}"
  • Para buscar una llave en el diccionario se deberá realizar del siguiente modo:

if  key in diccionario:
    acción a realizar

Siguiendo con el ejemplo del diccionario persona esto sería para el caso de buscar la key de "nombre"

if 'nombre' in persona :
    print(persona["persona"])

En este fragmento lo que realiza es preguntar si existe la key, en caso de ser verdadero se imprimirá su valor. Esta condición siempre retorna un "True" o "False", por lo que en caso de que no exista la key se omitirá dicha acción o se puede condicionar con un "sino".

Un modo quizás más elegante de hacerlo es utilizando el método "get()", en donde en caso de existir la key a buscar retornará el valor de dicha key

print(persona.get("nombre"))

La salida de este script será el valor de Pepito. ¿Qué sucede si el valor no existe? la respuesta es que retornará un valor "None", por lo que se recomienda utilizar esto también dentro de una condición como en el siguiente ejemplo:

if 'nombre' in persona:
    nombre = persona.get('nombre')
    print(nombre)

Por último y otra forma de condicionar es accediendo mediante el método "get()", por ejemplo:

print(persona.get('nombre', "no encontrado")
print(persona.get('brenom', "no encontrado")

En esto para el primer caso imprimirá el valor de la key nombre. Para el segundo caso como no existe la key "brenom", la salida sería el string "no encontrado".

  • Es posible obtener una lista de las claves utilizando el método "key()". Esto devolverá una lista completa de todas las claves dentro del diccionario.

keys = personas.keys()

Para este caso se han almacenados todas las keys del diccionario persona creado anteriormente y están en un tipo "dict_keys()", que puede ser tratado del mismo modo que una lista, por lo que es posible recorrerlo.

Ejemplo:

keys = personas.keys()
# Imprime tipo de la varible key
print(type(keys))
# Imprime contenido de key
print(keys)
# recorre lista de keys
for i in keys:
    # imprime todas las keys
    print(i)

La salida esperada por el script anterior sería en primer lugar el tipo de la variable key, en segundo lugar el contenido de la varible key y por último uno a uno las keys del diccionario persona.

<class 'dict_keys'>
dict_keys(['nombre', 'apellido', 'ciudad'])
nombre
apellido
ciudad
  • Obtener solo los valores del diccionario, esto se hace a través del método "values()" y devuelve una lista de elementos.

values = personas.values()
# Imprime tipo de la varible values
print(type(values))
# Imprime contenido de values
print(values)
# recorre lista de valores
for i in values:
    # imprime todos los valores
    print(i)

La salida esperada por el script anterior sería en primer lugar el tipo de la variable values "values_dict", en segundo lugar el contenido y por último uno a uno los valores del diccionario persona.

<class 'dict_values'>
dict_values(['Pepito', 'Pereira', 'Curicó'])
Pepito
Pereira
Curicó
  • Para iterar sobre las llaves y los valores simultáneamente, se usa el método "items()"

for key, value in persona.items():
    print ('La key {0} tiene como valor: {1}'.format(key, value))

Salida:

La key nombre tiene como valor: Pepito
La key apellido tiene como valor: Pereira
La key ciudad tiene como valor: Curicó

11.7. Diccionarios por comprensión

Los diccionario al igual que otras estructuras son elementos muy básicos y dinámicos, y por la forma en como se expresa Python se podría intuir sobre eso. Un ejemplo de lo dinámico es que Python permite a los programadores crear también un nuevo diccionario usando comprensiones, similar a la lista de comprensiones mencionadas anteriormente.

Un ejemplo muy simple y clásico es aquél que asigna números en un rango de 0 a 99 a sus cuadrados:

#!/usr/bin/env python3
# -*- coding:utf-8 *-*

# Número cuadrados
cuadrados = {numero: numero**2 for numero in range(100)}
print(cuadrados)