Un diccionario es un conjunto de información que está relacionada entre sí.
La primera relación ocurre entre una clave y su correspondiente valor. Dentro de un mismo diccionario puede haber uno, dos o muchos pares clave/valor.
La clave puede ser un número, una cadena, una tupla, un elemento de una lista, un valor de otro diccionario…
El valor puede ser cualquier tipo de dato, número, cadena, una lista, un conjunto, otro diccionario…
El requisito más importante es que cada clave debe ser única. No puede haber dos claves iguales. Los valores sí pueden repetirse.
diccionario={"a":14,"b":15,"c":16,"d":47,"e":47}
print(diccionario)Resultado:
{'a': 14, 'b': 15, 'c': 16, 'd': 47, 'e': 47}Podemos rescatar el valor de cualquier clave, haciendo mención al
diccionario y encerrando la clave entre corchetes: mi_diccionario[su_clave]
diccionario={"a":14,"b":15,"c":16,"d":47,"e":47,}
valor_1=diccionario["b"]
valor_2=diccionario["e"]
producto=valor_1*valor_2
print(producto)
print(diccionario["a"]+diccionario["d"])Resultado:
705
61diccionario={1:"Madrid",2:"Barcelona",3:"Valencia",4:"Zaragoza"}
ciudad_1=diccionario[1]
ciudad_2=diccionario[2]
print(f"Las ciudades más habitadas son ")
print(ciudad_1)
print(ciudad_2)Resultado:
Las ciudades más habitadas son
Madrid
Barcelonafor variable_1, variable_2 in diccionario.items( ):
Otra forma muy útil de recuperar los valores de un diccionario es pasando un bucle por el diccionario y rescatando todos los pares clave/valor.
La variable nombrada en primer lugar después de for…, quedará asociada a la clave, y la segunda al valor.
notas={"Javier":8.7, "Luis":3.2, "Pedro":7.1, "José":10, "Rodrigo":5.7}
total=0
for nombre, nota in notas.items():
print("El alumno ",nombre, " ha obtenido un ",nota)
total+=nota
total_alumnos=len(notas)
nota_media=total/total_alumnos
print("La nota media ha sido: ",nota_media)Resultado:
El alumno Javier ha obtenido un 8.7
El alumno Luis ha obtenido un 3.2
El alumno Pedro ha obtenido un 7.1
El alumno José ha obtenido un 10
El alumno Rodrigo ha obtenido un 5.7
La nota media ha sido: 6.94for variable in diccionario.keys( ) Puede ocurrir que solo estemos interesados en obtener todas las claves de un diccionario. En este bucle, la variable quedará asociada a cada una de las claves.
notas={"Javier":8.7, "Luis":3.2, "Pedro":7.1, "José":10, "Rodrigo":5.7}
for nombre in notas.keys():
print(nombre, "es alumno de este centro.")
if notas[nombre]==10:
cadena="\nEnhorabuena "+nombre+". Has obtenido un 10.\n"
print(cadena) Resultado:
Pedro es alumno de este centro.
José es alumno de este centro.
Enhorabuena José. Has obtenido un 10.
Rodrigo es alumno de este centro.for variable in sorted.(diccionario.keys( )) Con el modificador sorted, recorremos también todas las claves pero en esta ocasión, ordenadas según su código ASCII.
notas={"Javier":8.7, "Luis":3.2, "Pedro":7.1, "José":10, "Rodrigo":5.7}
for nombre in sorted(notas.keys()):
print(nombre, "es alumno de este centro.")
if notas[nombre]==10:
cadena="\nEnhorabuena "+nombre+". Has obtenido un 10.\n"
print(cadena) Resultado:
Javier es alumno de este centro.
José es alumno de este centro.
Enhorabuena José. Has obtenido un 10.
Luis es alumno de este centro.
Pedro es alumno de este centro.
Rodrigo es alumno de este centro.for variable in diccionario.values( ) Con esta construcción podemos recuperar los valores de un diccionario, sin prestar atención a sus claves. Ahora la variable estará asociada a cada uno de los valores del diccionario.
notas={"Javier":8.7, "Luis":3.2, "Pedro":7.1, "José":10,
"Rodrigo":5.7,"Rafael":3.1}
aprobados=0
suspendidos=0
for nota in notas.values():
if nota>=5:
aprobados+=1
else:
suspendidos+=1
print("Han aprobado:",aprobados,"alumnos.")
print("Han suspendido:",suspendidos,"alumnos.")Resultado:
Han aprobado: 4 alumnos.
Han suspendido: 2 alumnos.for variable in set(diccionario.values( )) Si nos interesa que los valores no puedan repetirse, nos podemos servir de esta función que convierte los valores en un conjunto, con lo que evita repeticiones.
profesionales={"José":"médico","Luis":"ingeniero",
"Jaime":"pintor","Pedro":"ingeniero",
"Javier":"pintor","Rafael":"médico"}
print("Mis primos ejercen las siguientes profesiones:")
for profesion in set(profesionales.values( )):
print(profesion)Resultado:
pintor
ingeniero
médicomi_diccionario[clave]=valor . Para añadir un nuevo par clave/valor a un diccionario, solo tenemos que definir la nueva clave y darle un valor.
diccionario={14:"a",15:"b",16:"c",47:"d",58:"e"}
diccionario[670]="z"
print(diccionario)Resultado:
{14: 'a', 15: 'b', 16: 'c', 47: 'd', 58: 'e', 670: 'z'}tu_diccionario= { } Podemos comenzar definiendo un diccionario en blanco, y después ir añadiendo valores uno por uno.
su_diccionario={}
su_diccionario["naranjo"]="naranjas"
su_diccionario["parra"]="uvas"
print(su_diccionario)Resultado:
{'naranjo': 'naranjas', 'parra': 'uvas'}mi_diccionario[su_clave]=nuevo_valor Si queremos cambiar el valor de una clave, simplemente tenemos que asignarle un nuevo valor.
su_diccionario={"naranjo": "naranjas", "parra": "cerezas"}
print(su_diccionario)
su_diccionario["parra"]="uvas"
print(su_diccionario){'naranjo': 'naranjas', 'parra': 'cerezas'}
{'naranjo': 'naranjas', 'parra': 'uvas'}del mi_diccionario[clave] Para borrar una par clave/valor, simplemente tenemos que borrar la clave con la instrucción del
su_diccionario={"naranjo": "naranjas", "parra": "uvas"}
print(su_diccionario)
del su_diccionario["naranjo"]
print(su_diccionario)Resultado:
{'naranjo': 'naranjas', 'parra': 'uvas'}
{'parra': 'uvas'}Si intentamos borrar una clave que no se encuentra en el diccionario, se nos genera un mensaje de error.
su_diccionario={"naranjo": "naranjas", "parra": "uvas"}
del su_diccionario["naranjo"]
mi_fruto=su_diccionario["parra"]
print(mi_fruto)
del su_diccionario["naranjo"]Resultado:
uvas
Traceback (most recent call last):
File "/home/keduardo/Documentos/Python/prueba.py", line 5, in <module>
del su_diccionario["naranjo"]
~~~~~~~~~~~~~~^^^^^^^^^^^
KeyError: 'naranjo'if clave in diccionario Para evitarlo, podemos hacer una comprobación previa y verificar que esa clave está contenida en el diccionario.
su_diccionario={"naranjo": "naranjas", "parra": "uvas"}
if "naranjo" in su_diccionario:
del su_diccionario["naranjo"]
if "naranjo" in su_diccionario:
del su_diccionario["naranjo"]
print(su_diccionario)Resultado:
{'parra': 'uvas'}También se nos generará un mensaje de error si intentamos leer una clave que no se encuentra en el diccionario. La solución puede ser la misma:
puntos={"Pepe":143,"Francisco":476.4,"Javier":89.3,"Pedro":764.9}
listado=["Juan","Francisco","Javier","Manuel"]
for jugador in listado:
if jugador in puntos:
print("El jugador",jugador,"tiene",puntos[jugador],"puntos.")Resultado:
El jugador Francisco tiene 476.4 puntos.
El jugador Javier tiene 89.3 puntos.valor= diccionario.get(valor, valor_defecto) También disponemos de este otro método que nos lee un valor si la clave existe, pero si no existe, en lugar de lanzar un error en tiempo de ejecución asigna a valor el valor por defecto que hayamos indicado.
puntos={"Pepe":143,"Francisco":476.4,"Javier":89.3,"Pedro":764.9}
listado=["Juan","Francisco","Javier","Manuel"]
for jugador in listado:
puntuación=puntos.get(jugador,f"{jugador} no tiene puntos.")
print(f"Puntos de {jugador}: {puntuación}")Resultado:
Puntos de Juan: Juan no tiene puntos.
Puntos de Francisco: 476.4
Puntos de Javier: 89.3
Puntos de Manuel: Manuel no tiene puntos.O también:
puntos={"Pepe":143,"Francisco":476.4,"Javier":89.3,"Pedro":764.9}
listado=["Juan","Francisco","Javier","Manuel"]
for jugador in listado:
puntuación=puntos.get(jugador,0)
print(f"Puntos de {jugador}: {puntuación}")Resultado:
Puntos de Juan: 0
Puntos de Francisco: 476.4
Puntos de Javier: 89.3
Puntos de Manuel: 0diccionario.clear( ) Con el método diccionario.clear eliminamos todos los pares claves/valor de un diccionario, dejándolo en blanco.
su_diccionario={"naranjo": "naranjas", "parra": "uvas"}
su_diccionario.clear()
print(su_diccionario)Resultado:
{ }del diccionario No debemos confundir vaciar un diccionario (con .clear), con la instrucción «del diccionario». Esta instrucción elimina completamente un diccionario. Si intentamos imprimirlo, nos daría error.
su_diccionario={"naranjo": "naranjas", "parra": "uvas"}
del su_diccionario
print(su_diccionario)Resultado:
Traceback (most recent call last):
File "/home/keduardo/Documentos/Python/prueba.py", line 3, in <module>
print(su_diccionario)
^^^^^^^^^^^^^^
NameError: name 'su_diccionario' is not definednuevo_diccionario=diccionario.copy ( ) Si queremos crear un nuevo diccionario basándonos en otro que ya tenemos, debemos de utilizar el método diccionario.copy( ). Si solo utilizamos el signo igual, lo único que conseguimos es tener un mismo diccionario con dos nombres diferentes.
diccionario={"a":14,"b":15,"c":16,"d":47,"e":47}
mismo_diccionario=diccionario
nuevo_diccionario=diccionario.copy()
del diccionario["b"]
print(diccionario)
print(mismo_diccionario)
print(nuevo_diccionario)Resultado:
{'a': 14, 'c': 16, 'd': 47, 'e': 47}
{'a': 14, 'c': 16, 'd': 47, 'e': 47}
{'a': 14, 'b': 15, 'c': 16, 'd': 47, 'e': 47}len (diccionario) Con la función len(diccionario) podemos averiguar la cantidad de pares clave/valor que un diccionario contiene.
diccionario={"a":[3,4,3],"b":15,"c":16,"d":47,"e":47}
n_pares=len(diccionario)
print(f"El diccionario contiene {n_pares} pares clave/valor.")Resultado:
El diccionario contiene 5 pares clave/valor.En el momento de definir un diccionario y darle los valores iniciales, es una buena idea escribir cada par clave/valor en una línea diferente para que el código sea más legible:
mi_guia_telefonica={
"Juan":922417688,
"Miguelina":632001200,
"Luis":922656500,
"Javier":883838888,
"Pepa":632128211
}
print(mi_guia_telefonica)Resultado:
{'Juan': 922417688, 'Miguelina': 632001200, 'Luis': 922656500, 'Javier': 883838888,
'Pepa': 632128211}par_eliminado=diccionario.popitem( ). Con este método eliminamos del diccionario el último par clave/valor introducido, que queda almacenado en la variable indicada, que almacenará en una tupla los valores eliminados.
puntos={"Pepe":143,"Francisco":476.4,"Javier":89.3,"Pedro":764.9}
print(puntos)
eliminado=puntos.popitem()
print(eliminado)
print(puntos)Resultado:
{'Pepe': 143, 'Francisco': 476.4, 'Javier': 89.3, 'Pedro': 764.9}
('Pedro', 764.9)
{'Pepe': 143, 'Francisco': 476.4, 'Javier': 89.3}mi_lista=list(diccionario) Con este método podemos obtener una lista con todos claves de un diccionario.
puntos={"Pepe":143,"Francisco":476.4,"Javier":89.3,"Pedro":764.9}
jugadores=list(puntos)
print(jugadores)Resultado:
['Pepe', 'Francisco', 'Javier', 'Pedro']Diccionarios y listas combinados. Si combinamos listas y diccionarios, podemos manejar una gran cantidad
de información dentro de una misma estructura de datos.
La siguiente estructura nos recuerda mucho a una base de datos tradicional.
Cada diccionario representa un registro de la base de datos. Cada clave, se correspondería con un campo. La base de datos sería la lista que engloba a todos los registros (diccionarios). Vemos al final de este código, una utilidad para calcular los goles del equipo, aprovechando la estructura de base de datos.
jugador_1={
"nombre":"Eduardo",
"puesto":"delantero1",
"edad":28,
"goles_marcados":14,
"temporadas":8
}
jugador_2={
"nombre":"Javier",
"puesto":"defensa",
"edad":31,
"goles_marcados":4,
"temporadas":10
}
jugador_3={
"nombre":"Andrés",
"puesto":"central",
"edad":23,
"goles_marcados":24,
"temporadas":2
}
jugador_4={
"nombre":"Felipe",
"puesto":"defensa_2",
"edad":35,
"goles_marcados":8,
"temporadas":12
}
jugadores=[jugador_1,jugador_2,jugador_3,jugador_4]
for jugador in jugadores:
print(jugador)
goles=0
for jugador in jugadores:
goles+=jugador["goles_marcados"]
print(f"El total de goles es del equipo es: {goles}"){'nombre': 'Javier', 'puesto': 'defensa', 'edad': 31, 'goles_marcados': 4, 'temporadas': 10}
{'nombre': 'Andrés', 'puesto': 'central', 'edad': 23, 'goles_marcados': 24, 'temporadas': 2}
{'nombre': 'Felipe', 'puesto': 'defensa_2', 'edad': 35, 'goles_marcados': 8, 'temporadas': 12}
El total de goles es del equipo es: 50Vemos a continuación un ejemplo de valor tipo lista, para una de las claves del diccionario.
jugador1={"Nombre": "Luis", "posición":"delantero","edad": 19,
"goles_anotados": 23, "jugó_en":["Real Madrid", "Cádiz", "Almería"]}
jugador2={"Nombre": "Pedro", "posición":"medio","edad": 24,
"goles_anotados": 11, "jugó_en":["Betis", "Jérez", "Barcelona"]}
jugador3={"Nombre": "Javier","posición":"defensa", "edad": 20,
"goles_anotados": 2, "jugó_en":["Valencia", "Almería", "Huelva"]}
jugadores_nacionales=[jugador1,jugador2,jugador3]
for jugador in jugadores_nacionales:
print(jugador)
k=len(jugador["jugó_en"])
ha_jugado=False
for i in range(0,k):
if (jugador["jugó_en"][i])=="Barcelona":
ha_jugado=True
if ha_jugado==True:
print(jugador["Nombre"], "ha jugado en el Barcelona.")
else:
print(jugador["Nombre"], "no ha jugado en el Barcelona.")Resultado:
{'Nombre': 'Luis', 'posición': 'delantero', 'edad': 19, 'goles_anotados': 23, 'jugó_en': ['Real Madrid', 'Cádiz', 'Almería']}
Luis no ha jugado en el Barcelona.
{'Nombre': 'Pedro', 'posición': 'medio', 'edad': 24, 'goles_anotados': 11, 'jugó_en': ['Betis', 'Jérez', 'Barcelona']}
Pedro ha jugado en el Barcelona.
{'Nombre': 'Javier', 'posición': 'defensa', 'edad': 20, 'goles_anotados': 2, 'jugó_en': ['Valencia', 'Almería', 'Huelva']}
Javier no ha jugado en el Barcelona.En el siguiente ejemplo, tomamos como valores clave diferentes conceptos de gastos que puede tener una vivienda. Como valor para cada clave, configuramos una lista, donde vamos añadiendo los gastos en dicho concepto que vamos anotando.
Es un pequeño y simplificado programa de contabilidad que nos puede dar la idea de las amplias posibilidades que nos puede dar utilizar listas como valores para una determinada clave.
cuenta_gastos = {}
while True:
print("Indique el nombre de un concepto de gasto y puse Return.")
concepto = input("(Para salir pulse Return sin valor.) ")
if concepto == '':
break
##SI INCLUIMOS UN DATO VACÍO PARA LA ENTRADA.
correcto=False
while correcto==False:
try:
precio=float(input(f"Introduzca gasto para {concepto}: "))
correcto=True
except ValueError:
print("Por favor, separe los decimales con un punto.")
if concepto in cuenta_gastos:
##si clave ya existe.
cuenta_gastos[concepto].append(precio) #nuevo valor en lista.
else:
cuenta_gastos[concepto] = [precio] ##si no existe la creamos.
for nombre in sorted(cuenta_gastos.keys()): #recorremos lista en orden
total = 0
k=len(cuenta_gastos[nombre]) #longitud de lista para cada clave
for k in range(0,k):
total += cuenta_gastos[nombre][k]
print(nombre, ":", total) Posible ejecución del programa:
Indique el nombre de un concepto de gasto y puse Return.
(Para salir pulse Return sin valor.) Luz
Introduzca gasto para Luz: 54.3
Indique el nombre de un concepto de gasto y puse Return.
(Para salir pulse Return sin valor.) Luz
Introduzca gasto para Luz: 34.5
Indique el nombre de un concepto de gasto y puse Return.
(Para salir pulse Return sin valor.) Agua
Introduzca gasto para Agua: 23.85
Indique el nombre de un concepto de gasto y puse Return.
(Para salir pulse Return sin valor.) Agua
Introduzca gasto para Agua: 14.3
Indique el nombre de un concepto de gasto y puse Return.
(Para salir pulse Return sin valor.) Comida
Introduzca gasto para Comida: 12.5
Indique el nombre de un concepto de gasto y puse Return.
(Para salir pulse Return sin valor.) Comida
Introduzca gasto para Comida: 120.2
Indique el nombre de un concepto de gasto y puse Return.
(Para salir pulse Return sin valor.) Comida
Introduzca gasto para Comida: 19
Indique el nombre de un concepto de gasto y puse Return.
(Para salir pulse Return sin valor.)
Agua : 38.150000000000006
Comida : 151.7
Luz : 88.8A continuación vemos un ejemplo de diccionario donde los valores para sus claves son diccionarios:
jugadores={"Santillana": {"zapato": 45, "calcetín": 32, "guantes":14},
"Amancio": {"zapato":38, "calcetín":30, "guantes":16},
"Alfonso": {"zapato":43, "calcetín":32, "guantes":13}}
for nombre, tallas in jugadores.items( ):
print(f"Nombre: {nombre}")
talla=tallas["zapato"]
calcetin=tallas["calcetín"]
guante=tallas["guantes"]
print(f"El jugador usa: talla {talla} de zapato, talla {
calcetin} de calcetín y guante {guante}\n") Resultado:
Nombre: Santillana
El jugador usa: talla 45 de zapato, talla 32 de calcetín y guante 14
Nombre: Amancio
El jugador usa: talla 38 de zapato, talla 30 de calcetín y guante 16
Nombre: Alfonso
El jugador usa: talla 43 de zapato, talla 32 de calcetín y guante 13
