3.5. Diccionarios#

3.5.1. Presentación de los diccionarios#

Un diccionario es un conjunto de pares clave:valor donde clave es un dato no mutable y valor es cualquier tipo de dato.

diccionario = {clave1:valor1, clave2:valor2,....,clavek:valork}

Un diccionario se define indicando sus elementos clave:valor:

Ejemplos

horario = {'lunes':'11:30', 'martes':'8:30', 'miércoles':'8:30',  'viernes':'11:30'}

El diccionario horario indica a que hora comienzan las clases de CNP.

Podemos definir otro diccionario con información adicional indicando el grupo que tiene clase en el día y la hora indicados. Para ello utilizamos listas como valores:

clases = {'lunes':['11:30','IAL'], 'martes':['8:30','IAG'], 'miércoles':['8:30','IAL'],  'viernes':['11:30','IAG']}

3.5.1.1. Observaciones#

  • Los elementos están formados por clave:valor

  • A cada clave le corresponde un solo valor

  • Puede definirse un diccionario vacío. Esta expersión asigna un diccionario vacio a la variable vacio: vacio = {}

  • Los elementos van separados por comas

  • La clave de cada elemento puede se cualquier tipo que sea inmutable

  • El valor de cada elemento puede ser de cuaquier tipo

  • Un diccionario es un iterable. La expresión

    • for u in diccionario: -> itera sobre el conjunto de claves de diccionario

    • for u in diccionario.keys() -> y es equivalente a la anterior

  • Es una estructura más general que los iterables que ya hemos vistos (cadenas, listas y tuplas). Para los diccionarios:

    • no hay un orden establecido en la suceción de elementos del diccionario y

    • se accede a los elementos del diccionario por la clave; no por la posición como en las anteriores estructuras (cadenas, listas y tuplas).

3.5.2. Generar diccionarios con zip#

Si L1 y L2 son dos iterables de igual longitud, el objeto zip(L1,L2) es un iterable que contiene tuplas

     (u1,u2) = (L1[k],L2[k]) con k = 0,1,2,...,len(L1) - 1.

Ejemplo

I = zip('abcdef', list(range(6)))
for u in I:
    print(u)
('a', 0)
('b', 1)
('c', 2)
('d', 3)
('e', 4)
('f', 5)

Con el objeto zip podemos definir un diccionario a partir de dos iterables L1, L2 de igual longitud. Los elementos del primer iterable serán las claves y los elementos correspondientes del segundo serán los valores:

     nuevo_diccionario = dict(zip(L1,L2))    

Ejemplos

letras = dict(zip('abcdef', list(range(6))))
letras
{'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5}
L1 = ['La Mari', 'La Paqui', 'La Juani']
L2 = [24,26,31]
edad = dict(zip(L1,L2))
edad
{'La Mari': 24, 'La Paqui': 26, 'La Juani': 31}

3.5.3. Funciones y métodos#

Obtener el valor de una clave dada

letras['a']
0

Si la clave no existe de un a error (KeyError)

letras['S']
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Input In [9], in <cell line: 1>()
----> 1 letras['S']

KeyError: 'S'

Longitud de un diccionario

len(letras)
6

Añadir elementos a un diccionario

Se pueden añadir nuevos elementos o cambiar los valores de las claves:

diccionario[clave] = valor

Si la clave no está en diccionario, se añade el par clave:valor, si ya está, cambia el valor asociado a clave:

Ejemplo 1

  • añadir un nuevo par clave:valor

letras['g'] = 6
letras
{'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6}
  • modificar un par clave:valor

letras['a'] = 1
letras
{'a': 1, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6}

Ejemplo 2

En este caso creamos un diccionario vacío y le añadimos elementos:

patas = {}

patas['gallina'] = 2

patas['vaca'] = 4

patas['rana'] = 4

patas['pulpo'] = 8

patas['mosca'] = 6

patas['araña'] = 8

patas['cigala'] = 10

patas
{'gallina': 2,
 'vaca': 4,
 'rana': 4,
 'pulpo': 8,
 'mosca': 6,
 'araña': 8,
 'cigala': 10}

Comprobar las claves

'A' in letras, 'a' in letras
(False, True)

Borrar

del(letras['a'])
letras
{'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6}

Lista de claves, valores y items de un diccionario

Las claves y los valores

list(letras.keys())
['b', 'c', 'd', 'e', 'f', 'g']
list(letras.values())
[1, 2, 3, 4, 5, 6]
for p in letras.keys():
    print(p)
b
c
d
e
f
g
for p in letras:
    print(p)
b
c
d
e
f
g
for p in letras.values():
    print(p)
1
2
3
4
5
6

Los items

list(letras.items())
[('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5), ('g', 6)]
for item in letras.items():
    print(item)
('b', 1)
('c', 2)
('d', 3)
('e', 4)
('f', 5)
('g', 6)

“Ordenar” un diccionario

sorted(letras)
['b', 'c', 'd', 'e', 'f', 'g']
sorted(letras.items())
[('b', 1), ('c', 2), ('d', 3), ('e', 4), ('f', 5), ('g', 6)]

Listado de funciones y métodos para los diccionarios

Función o método

Resultado

diccionario**[clave]**

devuelve el valor asociado a clave en diccionario, error si clave no pertenece a diccionario

len(diccionario)

cantidad de pares clave:valor del diccionario

del(diccionario[clave])

elimina el par clave:valor del diccionario

sorted(diccionario)

devuelve la lista ordenada de las claves

sorted(diccionario.items())

devuelve la lista ordenada de los elementos (como tuplas (clave, valor))

diccionario**.keys()**

devuelve un iterable que contiene las claves del diccionario

diccionario**.values()**

devuelve un iterable que contiene los valores del diccionario

diccionario**.items()**

devuelve las tuplas (clave,valor) en un iterable

clave in diccionario

devuelve True o False según clave esté en diccionario o no

diccionario**.get(clave)**

devuelve el valor asociado a clave, None si clave no está en diccionario

diccionario**.get(clave,otro)**

devuelve el valor asociado a clave, y otro si clave no está en diccionario

Uso de .get()

letras
{'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6}
letras.get('Catia')
letras.get('b', 'no está')
1
letras.get('Catia', 'no está')
'no está'

3.5.4. Ejemplos#

patas['araña']
8
patas['cabra']
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Input In [31], in <cell line: 1>()
----> 1 patas['cabra']

KeyError: 'cabra'
len(patas)
7
del patas['rana']
patas
{'gallina': 2, 'vaca': 4, 'pulpo': 8, 'mosca': 6, 'araña': 8, 'cigala': 10}
for u in patas.keys():
    print(u)
gallina
vaca
pulpo
mosca
araña
cigala
animales = list(patas.keys())
animales.sort()
for u in animales:
    print(u)
araña
cigala
gallina
mosca
pulpo
vaca
for u in animales:
    print(u, patas[u])
araña 8
cigala 10
gallina 2
mosca 6
pulpo 8
vaca 4
'cuervo' in patas
False
for u in patas.items():
    print(u)
('gallina', 2)
('vaca', 4)
('pulpo', 8)
('mosca', 6)
('araña', 8)
('cigala', 10)
for u in patas.items():
    print(u[0], u[1])
gallina 2
vaca 4
pulpo 8
mosca 6
araña 8
cigala 10
  • Lo que hacemos ahora no está relacionado directamente con diccionarios, pero es conveniente saber producir un listado con formato apropiado

for u in animales:
    print(u.ljust(10), patas[u])
araña      8
cigala     10
gallina    2
mosca      6
pulpo      8
vaca       4
print('Número de patas por animales')
print()
for u in animales:
    print(u.ljust(10), str(patas[u]).rjust(2))
Número de patas por animales

araña       8
cigala     10
gallina     2
mosca       6
pulpo       8
vaca        4
print('Clases de CNP')
print()
dias = list(clases.keys()) 
for u in dias:
    print(u.ljust(9), clases[u][0].rjust(7), ' ' + clases[u][1])
Clases de CNP

lunes       11:30  IAL
martes       8:30  IAG
miércoles    8:30  IAL
viernes     11:30  IAG
def frecuencias(texto):
    letras = 'bcdfghjklmnñpqrstvwxyz'
    texto.lower()
    diccionario = {}
    for letra in letras:
        frecuencia = 0
        for u in texto:
            if u == letra:
                frecuencia += 1
        if frecuencia:
            diccionario[letra] = frecuencia
    return diccionario
frecuencias('Cuando se elabora el pan, las condiciones atmosféricas influyen en el resultado final')
{'b': 1,
 'c': 3,
 'd': 3,
 'f': 3,
 'l': 7,
 'm': 1,
 'n': 8,
 'p': 1,
 'r': 3,
 's': 6,
 't': 2,
 'y': 1}

3.5.5. Ejercicios#

  1. Definir el diccionario capitales que contenga al menos cinco paises y sus respectivas capitales, con el formato capitales = {pais1:capital1,……}.

    • Una vez definido el diccionario, añadirle dos países más que no están en él. Antes de añadirlos, compruebe que realmente no están con el operador in.

    • Imprime una lista ordenada alfabéticamente de los países y sus capitales

  2. El diccionario notas contiene los nombres de los alumnos de un curso como claves, y como valores las listas de las notas en las tres evaluaciones parciales que se han realizado: notas = {‘Alfaro, Daniel’:[4,3], ‘Estable, Anabel’:[5,6,5], ‘García-Peña, Tomás’:[2,5,6], ‘Julián, Francisco’:[9,9,7],’Ruiz, Hipólito’:[3,7]}

    • Imprimir una lista de los alumnos matriculados en el curso.

    • Imprimir una lista de los alumnos que han aprobado todas las evaluaciones.

    • Imprimir una lista de los alumnos y sus notas medias.

    • Imprimir una lista de los alumnos que no han participado en alguna evaluación.

  3. La información de las existencias de fruta en una frutería se guarda en el diccionario existencia cuyas claves son las frutas y los valores son las cantidades correspondientes en kilos. Por ejemplo: existencias = {‘pera’:20, ‘manzana’:50, ‘kiwi’:25, ‘nectarina’: 40, ‘naranja’:25, ‘pomelo’:15, ‘limón’:10}. Se llevan también los diccionarios ventas y suministros de estructura similar y que se actualizan al final del día.

    • Definir la función actualizar(existencias,ventas,suministros) que actualiza los valores de existencias después de las ventas y entradas del día.

    • Imprimir una lista de las frutas cuya cantidad haya aumentado al final del día.

  4. Definir la función frecuencias(texto) que devuelve un diccionario cuyas claves son las consonantes y los valores son las frecuencias con que cada letra aparecen en texto. A continuación, utiliza la función definida para:

    • Ddefinir la función consonantes(texto) que imprime una lista de las consonantes que aparecen en texto.

    • Definir la función mas_frecuente(texto) que devuelve la consonante más frecuente en texto.

    • Definir la función raras(texto) que devuelve una lista de las consonantes que no aparecen en texto.

3.5.6. Cuestionarios de Moodle#

Cuestionario sobre diccionarios

Las notas de una asignatura

Manejo de Diccionarios, Ficheros y Módulos