DICCIONARIOS

En Python, un diccionario es una colección no ordenada de pares clave - valor donde la clave y el valor son objetos Python.

  • El acceso a los elementos de un diccionario se realiza a través de la clave.
  • En otros lenguajes se les conoce como tablas hash.


CREAR UN DICCIONARIO

De la misma forma que con listas, es posible definir un diccionario directamente con los miembros que va a contener, o bien inicializar el diccionario vacío y luego agregar los valores.

  • Los diccionarios se crean utilizando llaves { }.
  • Los elementos del diccionario son de la forma clave : valor y cada uno de los elementos se separan por comas.

In [3]:
# Definición de un diccionario vacío, los diccionarios se engloban mediante llaves {}
dic = { }
# Nos devuelve que el diccionario 'dic' está vacío
bool(dic)


Out[3]:
False

In [4]:
# En los diccionarios siempre debe definirse una clave y un valor
# Sintáxis: dic = {clave: 'valor', clave: 'valor', clave: 'valor'}
dic =  {1:'Lunes', 2:'Martes', 3:'Miercoles' }
dic


Out[4]:
{1: 'Lunes', 2: 'Martes', 3: 'Miercoles'}

La clave de un diccionario puede ser cualquier variable de tipo inmutable:

  • cadenas
  • enteros
  • tuplas (con valores inmutables en sus miembros), etc.

Los valores de un diccionario pueden ser de cualquier tipo: listas, cadenas, tuplas, otros diccionarios, objetos, etc.


In [5]:
# El diccionario 'd1' tiene como clave cadenas y como valor enteros o tuplas
d1 = {'Lunes' : 1, 'Martes' : 2 , 'Finde' : (6,7) }
print(d1)
# Aunque los elementos de un diccionario se defninan de manera desordenada, al llamar a dicho diccionario estos
# siempre aparecerán de manera ordenada mediante su clave.
d2 = {7:'Domingo', 1:'Lunes', 3:'Miércoles', 6:'Sábado', 5:'Viernes', 2:'Martes', 4:'Jueves'}
d2


{'Lunes': 1, 'Martes': 2, 'Finde': (6, 7)}
Out[5]:
{1: 'Lunes',
 2: 'Martes',
 3: 'Miércoles',
 4: 'Jueves',
 5: 'Viernes',
 6: 'Sábado',
 7: 'Domingo'}

Otra forma de crear un diccionario es declararlo vacío y luego añadir los valores, se le declara como un par de llaves sin nada en medio, y luego se asignan valores directamente a los índices.


In [6]:
# Se declara un diccionario vacío
dic = {}
# Se añaden elementos a dicho diccionario otorgando un valor a la clave
dic[1] = 'a'
dic[2] = 'b'
dic[3] = 'c'
dic


Out[6]:
{1: 'a', 2: 'b', 3: 'c'}


ACCESO A LOS ELEMENTOS DE UN DICCIONARIO

Para acceder al valor asociado a una determinada clave, utilizamos la notación de corchetes [ ] usada en listas, pero utilizando la clave elegida en lugar del índice.


In [7]:
dic = {'x': 1, 'y': 2, 'z': 4}
dic['y']


Out[7]:
2

Las claves son únicas dentro de un diccionario, es decir que no puede haber un diccionario que tenga dos veces la misma clave, si se asigna un valor a una clave ya existente, se reemplaza el valor anterior.


In [8]:
# Definimos un nuevo valor para la clave 'y', que lo que hará es borrar el anterior valor y sustituirlo por el nuevo
dic['y'] = 99
# Añade una nueva clave, no existente, con su valor correspondiente
dic['zz'] = 'Hola'
dic


Out[8]:
{'x': 1, 'y': 99, 'z': 4, 'zz': 'Hola'}

In [9]:
# Si se intenta acceder a una clave no existente, Python nos arroja un error
dic['xx']


---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-9-3024cc78b60b> in <module>()
      1 # Si se intenta acceder a una clave no existente, Python nos arroja un error
----> 2 dic['xx']

KeyError: 'xx'

Para evitar estos errores, podemos usar la función in , que comprueba si un elemento está en el diccionario o utilizar el método get , que devuelve el valor None si la clave no está en el diccionario.


In [25]:
# dic = {'x': 1, 'y': 2, 'z': 4}
# Preguntamos por la clave y nos devuelve un valor booleano
'x' not in dic


Out[25]:
False

In [11]:
# Mediante GET podemos realizar una consulta sobre una clave para conocer su valor
# dic.get('x')
# Mediante la función TYPE, podemos averiguar si está presente o no el diccionario o de que tipo es el valor
# type(dic.get('x'))
# Si la clave no está en el diccionario nos muestra una variable de tipo NONE
type(dic.get('xx'))


Out[11]:
NoneType

Para eliminar elementos de un diccionario se utiliza el método pop:


In [12]:
dic


Out[12]:
{'x': 1, 'y': 99, 'z': 4, 'zz': 'Hola'}

In [16]:
borrar = dic.pop('zz')
borrar


---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-16-2af138cef024> in <module>()
----> 1 borrar = dic.pop('zz')
      2 borrar

KeyError: 'zz'

In [17]:
dic


Out[17]:
{'x': 1, 'y': 99, 'z': 4}

In [18]:
# NOTA DE AUTOR
# Método para capturar un error de tipo KeyError en Python
try:
    dic['xx']
except KeyError:       # capturamos la excepción
    print("Cuidado, no existe la clave" + " 'xx' " + "en el diccionario")


Cuidado, no existe la clave 'xx' en el diccionario


MÉTODOS: KEYS, VALUES Y UPDATE

El método keys devuelve una lista con las claves del diccionario. El método values devuelve una lista con los valores del diccionario.


In [19]:
dic


Out[19]:
{'x': 1, 'y': 99, 'z': 4}

In [24]:
# Uso del método KEYS para obtener el valor de las claves de un diccionario
dic.keys()


Out[24]:
dict_keys(['x', 'y', 'z'])

In [24]:
# Uso del método VALUES para obtener el los valores de un diccionario
dic.values()


Out[24]:
dict_values([1, 99, 4])

In [25]:
# Para fusionar diccionarios utilizamos el método update.
d1


Out[25]:
{'Finde': (6, 7), 'Lunes': 1, 'Martes': 2}

In [26]:
d2


Out[26]:
{1: 'Lunes',
 2: 'Martes',
 3: 'Miércoles',
 4: 'Jueves',
 5: 'Viernes',
 6: 'Sábado',
 7: 'Domingo'}

In [27]:
d1.update(d2)
d1


Out[27]:
{'Lunes': 1,
 'Martes': 2,
 'Finde': (6, 7),
 7: 'Domingo',
 1: 'Lunes',
 3: 'Miércoles',
 6: 'Sábado',
 5: 'Viernes',
 2: 'Martes',
 4: 'Jueves'}


LA FUNCIÓN ZIP

Existen algunas diferencias entre las versiones 2.7 y 3.5 de Python:

  • Python 2.7: La función zip permite crear una lista de tuplas a partir de los elementos de otras secuencias.
  • Python 3.5: La función zip permite crear un objeto iterable a partir de los elementos de otras secuencias.

In [28]:
# Vamos a ver un ejemplo en Python 3.5
# Definimos una lista llamada 's1'
s1 = [1, 2, 3, 4]
# Definimos una lista llamada 's2'
s2 = ['primavera', 'otoño', 'verano', 'invierno']
# Uso de la función ZIP para unir ambas listas
z = zip(s1, s2)
# Creamos una lista a partir de la variable 'z' que a su vez es un merge de las listas 's1' y 's2'
# Lo que nos mostrará será un solapamiento de ambas listas, alternando entre valores de la primera y la segunda,
# como si de una cremallera se tratase
s_zip = list(z) # Guardamos la lista en una variable para poder usarla
s_zip           # Mostramos la lista contenida en la variable s_zip


Out[28]:
[(1, 'primavera'), (2, 'otoño'), (3, 'verano'), (4, 'invierno')]

In [29]:
# Preguntamos por el primero de los valores de la lista
s_zip[0]


Out[29]:
(1, 'primavera')

También podemos hacer zip inverso para separar una lista de tuplas en varias secuencias.


In [30]:
# Con los datos del ejemplo anterior
s1 = [1, 2, 3 , 4]
s2 = ['primavera', 'verano', 'otoño', 'invierno' ]
z = zip(s1, s2)
s_zip = list(z)
s_zip


Out[30]:
[(1, 'primavera'), (2, 'verano'), (3, 'otoño'), (4, 'invierno')]

In [31]:
# Definimos dos variables 'c1' y 'c2' para desentrelazar la lista contenida dentro de la variable 's_zip'
# que a su vez contiene una lista de tuplas
c1, c2 = zip(*s_zip)
# Mostramos el resultado
c1, c2


Out[31]:
((1, 2, 3, 4), ('primavera', 'verano', 'otoño', 'invierno'))

In [32]:
# A partir de secuencias también es posible crear diccionarios
# Definimos la variable 'map' como un diccionario usando la función dict()
map = dict(zip(s1,c2))
map


Out[32]:
{1: 'primavera', 2: 'verano', 3: 'otoño', 4: 'invierno'}

In [ ]: