8 Diccionarios
Un diccionario es una colección de pares formados por una clave y un valor asociado a la clave.
Se caracterizan por:
- No tienen orden.
- Pueden contener elementos de distintos tipos.
- Son mutables, es decir, pueden alterarse durante la ejecución de un programa.
- Las claves son únicas, es decir, no pueden repetirse en un mismo diccionario, y pueden ser de cualquier tipo de datos inmutable.
8.1 Creación de diccionarios con llaves
Para crear un diccionario basta con escribir sus pares entre llaves { } separados por comas. En cada par del diccionario la clave se separa del valor asociado con dos puntos :.
# Diccionario vacío
type({})
<class 'dict'>
# Diccionario con elementos de distintos tipos
{'nombre':'Alfredo', 'despacho': 218, 'email':'asalber@ceu.es'}
# Diccionarios anidados
{'nombre_completo':{'nombre': 'Alfredo', 'Apellidos': 'Sánchez Alberca'}}8.2 Acceso a los elementos de un diccionario
d[clave]devuelve el valor del diccionariodasociado a la claveclave. Si en el diccionario no existe esa clave devuelve un error.d.get(clave, valor)devuelve el valor del diccionariodasociado a la claveclave. Si en el diccionario no existe esa clave devuelvevalor, y si no se especifica un valor por defecto devuelveNone.
>>> a = {'nombre':'Alfredo', 'despacho': 218, 'email':'asalber@ceu.es'}
>>> a['nombre']
'Alfredo'
>>> a['despacho'] = 210
>>> a
{'nombre':'Alfredo', 'despacho': 218, 'email':'asalber@ceu.es'}
>>> a.get('email')
'asalber@ceu.es'
>>> a.get('universidad', 'CEU')
'CEU'8.3 Operaciones que no modifican un diccionario
len(d): Devuelve el número de elementos del diccionariod.min(d): Devuelve la mínima clave del diccionariodsiempre que las claves sean comparables.max(d): Devuelve la máxima clave del diccionariodsiempre que las claves sean comparables.sum(d): Devuelve la suma de las claves del diccionariod, siempre que las claves se puedan sumar.clave in d: DevuelveTruesi la claveclavepertenece al diccionariodyFalseen caso contrario.d.keys(): Devuelve un iterador sobre las claves de un diccionario.d.values(): Devuelve un iterador sobre los valores de un diccionario.d.items(): Devuelve un iterador sobre los pares clave-valor de un diccionario.
>>> a = {'nombre':'Alfredo', 'despacho': 218, 'email':'asalber@ceu.es'}
>>> len(a)
3
>>> min(a)
'despacho'
>>> 'email' in a
True
>>> a.keys()
dict_keys(['nombre', 'despacho', 'email'])
>>> a.values()
dict_values(['Alfredo', 218, 'asalber@ceu.es'])
>>> a.items()
dict_items([('nombre', 'Alfredo'), ('despacho', 218), ('email', 'asalber@ceu.es')])8.4 Operaciones que modifican un diccionario
d[clave] = valor: Añade al diccionariodel par formado por la claveclavey el valorvalor.d.update(d2). Añade los pares del diccionariod2al diccionariod.d.pop(clave, alternativo): Devuelve del valor asociado a la claveclavedel diccionariody lo elimina del diccionario. Si la clave no está devuelve el valoralternativo.d.popitem(): Devuelve la tupla formada por la clave y el valor del último par añadido al diccionariody lo elimina del diccionario.del d[clave]: Elimina del diccionariodel par con la claveclave.d.clear(): Elimina todos los pares del diccionariodde manera que se queda vacío.
>>> a = {'nombre':'Alfredo', 'despacho': 218, 'email':'asalber@ceu.es'}
>>> a['universidad'] = 'CEU'
>>> a
{'nombre': 'Alfredo', 'despacho': 218, 'email': 'asalber@ceu.es', 'universidad': 'CEU'}
>>> a.pop('despacho')
218
>>> a
{'nombre': 'Alfredo', 'email': 'asalber@ceu.es', 'universidad': 'CEU'}
>>> a.popitem()
('universidad', 'CEU')
>>> a
{'nombre': 'Alfredo', 'email': 'asalber@ceu.es'}
>>> del a['email']
>>> a
{'nombre': 'Alfredo'}
>>> a.clear()
>>> a
{}8.5 Copia de diccionarios
Existen dos formas de copiar diccionarios:
- Copia por referencia
d1 = d2: Asocia la la variabled1el mismo diccionario que tiene asociado la variabled2, es decir, ambas variables apuntan a la misma dirección de memoria. Cualquier cambio que hagamos a través del1ol2afectará al mismo diccionario. - Copia por valor
d1 = list(d2): Crea una copia del diccionario asociado ad2en una dirección de memoria diferente y se la asocia ad1. Las variables apuntan a direcciones de memoria diferentes que contienen los mismos datos. Cualquier cambio que hagamos a través del1no afectará al diccionario del2y viceversa.
>>> a = {1:'A', 2:'B', 3:'C'}
>>> # copia por referencia
>>> b = a
>>> b
{1:'A', 2:'B', 3:'C'}
>>> b.pop(2)
>>> b
{1:'A', 3:'C'}
>>> a
{1:'A', 3:'C'}>>> a = {1:'A', 2:'B', 3:'C'}
>>> # copia por referencia
>>> b = dict(a)
>>> b
{1:'A', 2:'B', 3:'C'}
>>> b.pop(2)
>>> b
{1:'A', 3:'C'}
>>> a
{1:'A', 2:'B', 3:'C'}