Apéndice L — Diccionarios.

Objetivo. Describir la estructura de datos dict mediante la exposición de ejemplos.

L.1 Introducción.

Recordemos los cuatro tipos de colecciones que se tienen en Python:

Tipo Ordenada Inmutable Indexable Duplicidad
List SI NO SI SI
Tuple SI SI SI SI
Sets NO NO NO NO
Dict NO NO SI NO

L.2 Diccionarios.

  • Consisten en una secuencia NO ordenada y mutable.
  • NO permite miembros duplicados.
  • Cada elemento de un diccionario contiene una clave y un valor.
  • Los elementos de los diccionarios se pueden indexar a través de las claves.
  • Los diccionarios se definen usando llaves ({}) y dos puntos (:) para separar la clave del valor y comas (,) para separar sus elementos.
Ejemplo L.1: Creación de diccionarios.

Un diccionario se puede crear de tres maneras diferentes:

  1. Dando los pares key:value separados por ,:
d1 = {'Luis':20, 'Miguel':25, 'Pedro':31, 'Pablo':12}
  1. Usando el constructor dict() y dando los pares key = value separados por ,:
d2 = dict(Luis=20, Miguel=25, Pedro=31, Pablo=12)
  1. Usando el constructor dict() y dando una lista de tuplas (key, value) separadas por ,:
d3 = dict([('Luis', 20), 
           ('Miguel', 25), 
           ('Pedro', 31), 
           ('Pablo', 12)])

Los tres diccionarios así creados, d1, d2 y d3, son equivalentes y contienen la misma información. Crear estos diccionarios.

Creación de los diccionarios:

d1 = {'Luis':20, 'Miguel':25, 'Pedro':31, 'Pablo':12}
d2 = dict(Luis=20, Miguel=25, Pedro=31, Pablo=12)
d3 = dict([('Luis', 20), 
           ('Miguel', 25), 
           ('Pedro', 31), 
           ('Pablo', 12)])
print(d1)
print(d2)
print(d3)
{'Luis': 20, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12}
{'Luis': 20, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12}
{'Luis': 20, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12}

Los tres diccionarios son objetos diferentes:

print(type(d1), id(d1))
print(type(d2), id(d2))
print(type(d3), id(d3))
<class 'dict'> 2051985577088
<class 'dict'> 2051985576256
<class 'dict'> 2051985576128

L.3 Indexado mediante la clave

Los diccionarios se pueden indexar usando las claves de los elementos, por ejemplo:

print(d1['Luis'])
print(d1['Pedro'])
20
31

Se puede modificar un valor de un cierto elemento:

print(d1)
d1['Luis'] = 53
print(d1)
{'Luis': 20, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12}
{'Luis': 53, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12}

Cuando el elemento con la clave que se proporciona no existe, entonces se agrega un nuevo elemento:

d1['fulano'] = 15
print(d1)
{'Luis': 53, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12, 'fulano': 15}

L.4 Métodos de los diccionarios.

En términos de Programación Orientada a Objetos, la clase <class 'dict'> define una serie de métodos que se pueden aplicar sobre los objetos del tipo dict. Veamos algunos ejemplos:

L.4.1 Obtener todos los elementos del diccionario.

d1.items() 
dict_items([('Luis', 53), ('Miguel', 25), ('Pedro', 31), ('Pablo', 12), ('fulano', 15)])

L.4.2 Obtener todas las claves de los elementos del diccionario.

d1.keys() 
dict_keys(['Luis', 'Miguel', 'Pedro', 'Pablo', 'fulano'])

L.4.3 Obtener todos los valores de los elementos del diccionario.

d1.values() 
dict_values([53, 25, 31, 12, 15])

L.4.4 Obtener el valor de un elemento:

d1.get('Luis') # Valor del elemento cuya clave es `'Luis'`.
53

L.4.5 Agregar un diccionario en otro.

d4 = {'Azul':35, 'Cereza':45}
d1.update(d4) # Agregamos el diccionario d4 al diccionario d1
print(d1)
{'Luis': 53, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12, 'fulano': 15, 'Azul': 35, 'Cereza': 45}

Si los elementos ya existen, solo se actualizan los valores.

d5 = {'Luis':512, 'fulano':10}
d1.update(d5)
print(d1)
{'Luis': 512, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12, 'fulano': 10, 'Azul': 35, 'Cereza': 45}

L.4.6 Extraer el último elemento del diccionario.

print(d1.popitem()) 
print(d1)
('Cereza', 45)
{'Luis': 512, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12, 'fulano': 10, 'Azul': 35}

L.4.7 Extraer el elemento de una cierta clave.

print(d1.pop('Miguel')) # Elemento de clave `'Miguel'`.
print(d1)
25
{'Luis': 512, 'Pedro': 31, 'Pablo': 12, 'fulano': 10, 'Azul': 35}

L.4.8 Eliminar todos los elementos del diccionario.

print(d1, id(d1)) # Antes de eliminar los elementos
d1.clear() # elimina todos los elementos del diccionario
print(d1, id(d1)) # Después de eliminar los elementos
{'Luis': 512, 'Pedro': 31, 'Pablo': 12, 'fulano': 10, 'Azul': 35} 2051985577088
{} 2051985577088

L.5 Operaciones y funciones sobre diccionarios.

  • Imprimimos el diccionario d2.
print(d2)
{'Luis': 20, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12}
  • Es posible usar las características de los diccionarios para imprimir la salida.
# Usando la clave y cadenas formateadas
print(f"Luis:{d2['Luis']}, Miguel:{d2['Miguel']}")
Luis:20, Miguel:25
# Usando la clave, el método str.format() y pasando el diccionario como argumento
print("Luis:{d[Luis]}, Miguel:{d[Miguel]}".format(d = d2))
Luis:20, Miguel:25
# Una forma más clara y concisa:
print("Luis:{Luis}, Miguel:{Miguel}".format(**d2))
Luis:20, Miguel:25
  • ¿Existe el elemento 'Miguel' en el diccionario?
'Miguel' in d2
True
  • ¿Existe el valor 25 en los valores del diccionario?
25 in d2.values()
True
  • ¿Existe la clave 'Luis' en las claves del diccionario?
'Luis' in d2.keys()
True
  • Algunas funciones comunes:
print(len(d2))
print(max(d2))
print(min(d2))
print(all(d2))
print(any(d2))
print(sorted(d2))

# Suma de los valores del diccionario
print(sum(list(d2.values())))
4
Pedro
Luis
True
True
['Luis', 'Miguel', 'Pablo', 'Pedro']
88
  • Eliminar el elemento 'Miguel':25
del d2['Miguel'] 
print(d2)
{'Luis': 20, 'Pedro': 31, 'Pablo': 12}

L.6 Copiando diccionarios

# Imprimimos el contenido del diccionario
print(d3)
{'Luis': 20, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12}

L.6.1 Copiando con el método copy()

d3_copia = d3.copy()

print(d3, type(d3), id(d3))
print(d3_copia, type(d3_copia), id(d3_copia))
{'Luis': 20, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12} <class 'dict'> 2051985576128
{'Luis': 20, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12} <class 'dict'> 2051985589056

L.6.2 Copiando con la biblioteca copy()

import copy
d3_copia = copy.copy(d3)

print(d3, type(d3), id(d3))
print(d3_copia, type(d3_copia), id(d3_copia))
{'Luis': 20, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12} <class 'dict'> 2051985576128
{'Luis': 20, 'Miguel': 25, 'Pedro': 31, 'Pablo': 12} <class 'dict'> 2051985587584