Autor: Juan Pablo Fuentes
Ejercicios diccionarios anidados
🧪 Ejercicio 1: Alumnos y sus notas
Diccionario: Cada alumno tiene una lista de notas.
alumnos = {
"Ana": [8, 9, 10],
"Luis": [5, 6, 7],
"Marta": [9, 8, 9]
}
📌 Tareas:
- Imprime el promedio de notas de cada alumno.
- Añade una nota más a cada alumno (da igual la que sea).
- Muestra el alumno con la nota media más alta.
🧪 Ejercicio 2: Inventario por categoría
Diccionario: Categorías con listas de productos.
inventario = {
"frutas": ["manzana", "pera", "plátano"],
"verduras": ["zanahoria", "brócoli"],
"bebidas": ["agua", "zumo"]
}
📌 Tareas:
- Añade «sandía» a la categoría de frutas.
- Imprime todos los productos (uno por línea).
- Cuenta cuántos productos hay en total.
# Diccionario donde cada cliente tiene una lista de pedidos (cada pedido es un dict)
clientes = {
«Juan»: [{«producto»: «Libro», «precio»: 20}, {«producto»: «Lápiz», «precio»: 2}],
«Ana»: [{«producto»: «Cuaderno», «precio»: 5}],
«Luis»: [{«producto»: «Tablet», «precio»: 200}, {«producto»: «Funda», «precio»: 15}]
}
def total_gastado(cliente, datos): # Nos devuelve cuanto ha gastado cada cliente en total
def productosPorCliente(datos): # nos devuelve un diccionario donde la clave es el nombre del cliente y el valor es el número de productos
Para saber si un diccionario ya tiene una clave usamos ‘in’ como en las listas
if «Ana» in clientes:
Ejemplos diccionarios anidados
# Listas: conjunto de elementos sobre el que podemos realizar diferentes operaciones
# Tuplas: como las listas pero se pueden desempaquetar
# Diccionarios: Conjunto de pares clave, valor
notas = [1, 2, 3, 4]
tupla = (1, 2, 3)
diccionario = {
"nombre": "Ana",
"nota": 6
}
# En python todo esto se puede combinar
# Quiero guardar los datos de un alumno
alumno = {
"nombre": "ana",
"email": "ana@ana.es",
"curso": "Python"
}
# Quiero guardar también las asignaturas, que son varias
alumno = {
"nombre": "ana",
"email": "ana@ana.es",
"curso": "Python",
"asignaturas": ["Programación", "Bases de datos"]
}
# Para cada asignatura, quiero guardar su nota y su profesor
alumno = {
"nombre": "ana",
"email": "ana@ana.es",
"curso": "Python",
"asignaturas": [{"nombre": "Programación", "nota": 7, "profesor": "JP"},
{"nombre": "Bases de datos", "nota": 8, "profesor": "Iu"}]
}
# Para cada asignatura, tiene 3 notas
alumno = {
"nombre": "ana",
"email": "ana@ana.es",
"curso": "Python",
"asignaturas": [{"nombre": "Programación", "nota": [7, 8, 6], "profesor": "JP"},
{"nombre": "Bases de datos", "nota": [8, 9, 9], "profesor": "Iu"}]
}
# Guardar la información de toda la clase que son varios alumnos
clase = [{
"nombre": "ana",
"email": "ana@ana.es",
"curso": "Python",
"asignaturas": [{"nombre": "Programación", "nota": [7, 8, 6], "profesor": "JP"},
{"nombre": "Bases de datos", "nota": [8, 9, 9], "profesor": "Iu"}]
},
{
"nombre": "iu",
"email": "iu@iu.es",
"curso": "Python",
"asignaturas": [{"nombre": "Programación", "nota": [4, 2, 3], "profesor": "JP"},
{"nombre": "Bases de datos", "nota": [8, 9, 9], "profesor": "Iu"}]
}
,
{
"nombre": "Eva",
"email": "eva@eva.es",
"curso": "Bases de datos",
"asignaturas": [{"nombre": "sistema", "nota": [5, 7, 6], "profesor": "Pep"},
{"nombre": "Bases de datos", "nota": [7, 6, 9], "profesor": "Iu"}]
}
]
for alumno in clase:
print(alumno) # Recorro los alumnos que, recordemos, son diccionarios
# Quiero un listado de todos los alumnos
for alumno in clase:
print(alumno["nombre"])
nombres = [alumno['nombre'] for alumno in clase]
print(nombres)
# Para cada alumno ver las asignaturas que tiene
# Primero me recorro los alumnos
for alumno in clase:
print(f"El alumno {alumno['nombre']} tiene las asignaturas:")
for asignatura in alumno["asignaturas"]:
print(asignatura["nombre"])
# Para cada alumno ver los profesores que tiene
for alumno in clase:
print(f"El alumno {alumno['nombre']} tiene los profesores:")
for asignatura in alumno["asignaturas"]:
print(asignatura["profesor"])
print(f"Que le ha puesto las siguienes notas")
for nota in asignatura["nota"]:
print(nota)
votaciones = [
{
"votante": "Juan",
"votos": [
{"participante": "Ana", "puntos": 5},
{"participante": "Pedro", "puntos": 3}
]
},
{
"votante": "Marta",
"votos": [
{"participante": "Ana", "puntos": 4},
{"participante": "Luis", "puntos": 2}
]
},
{
"votante": "Pedro",
"votos": [
{"participante": "Ana", "puntos": 3},
{"participante": "Luis", "puntos": 5}
]
}
]
# Nombre de los votantes
for votante in votaciones:
print(f"El votante {votante["votante"]} ha hecho los siguientes votos")
for voto in votante["votos"]:
print(f"{voto["puntos"]} al participante {voto["participante"]}")
# Cuantos puntos tiene un participante
def puntosParticipante(votaciones, participante):
puntos = 0
for votante in votaciones:
for voto in votante["votos"]:
if voto["participante"] == participante:
puntos += voto["puntos"]
return puntos
print(puntosParticipante(votaciones, "Ana"))
Soluciones ejercicios tuplas y diccionarios
# Cread una función provincias() que nos devuelva una tupla con las provincias de Catalunya
# utilizad desempaquetamiento para asignarlo a cuatro variables a,b,c,d
# Recorred la tupla con un for
def provincias():
return ("Barcelona", "Girona", "Lleida", "Tarragona")
a, b, c, d = provincias()
print(c) # Lleida
for provincia in provincias():
print(provincia)
# Cread una función descuentos que nos devuelva una tupla con descuentos de 5,10 y 20
# utilizad desempaquetamiento para:
# obtener los 3 descuentos
# obtener el primer descuento e ignorar los otros dos
def descuentos():
return (5, 10, 20)
d1, d2, d3 = descuentos()
print(d1, d2, d3)
d1, *_ = descuentos()
d1, _, _ = descuentos()
print(d1)
print(descuentos())
# Cread una función estadística a la que le pasamos una lista de números y nos devuelve una tupla
# con la cantidad de números, la suma, y la media
# estadistica([1,2,3,4])->(4,10,2.5)
# Tuplas
def estadistica(lista):
return (len(lista), sum(lista), sum(lista) / len(lista))
print(estadistica([1, 2, 3, 4]))
# Ejemplos de desempaquetado
# solo quiero la media
*_, media = estadistica([1, 2, 3, 4])
print(media)
# solo quiero la suma
_, suma, _ = estadistica([1, 2, 3, 4])
print(suma)
# Si quiero recuperar todo hago esto
longitud, suma, media = estadistica([1, 2, 3, 4])
# vs Listas
def estadistica(lista):
return [len(lista), sum(lista), sum(lista) / len(lista)]
# quiero saber la media
media = estadistica([2, 4, 91, 7])[2]
# quiero todos
longitud = estadistica([2, 4, 91, 7])[0]
suma = estadistica([2, 4, 91, 7])[1]
media = estadistica([2, 4, 91, 7])[2]
# Cread un diccionario para almacenar los datos de un cliente que son nombre Eva, email eva@eva.com
# telefono 666777666 y credito 5000
cliente = {
"nombre": "Eva",
"email": "eva@eva.com",
"telefono": "666777666",
"credito": 5000
}
# Cread una función a la que le pasamos un diccionario como el de los libros y nos devuelve el
# título del libro que tenga más ejemplares
def masEjemplares(libros):
titulo = ""
ejemplares = 0
for clave, valor in libros.items():
if valor > ejemplares:
ejemplares = valor
titulo = clave
return titulo
inventario = {
"Cien años de soledad": 400,
"El Principito": 10,
"1984": 6,
"Tierra yerma": 400
}
inventario["El Quijote"] = 90
print(masEjemplares(inventario))
print(list(inventario.keys())[1:3])
# list, tuple y dict podemos convertir a lista, tupla o diccionario
print(list(inventario)) # todas las claves
print(list(inventario.values())) # todos los valores
print(max(inventario.values()))
def masEjemplares2(libros):
maximo = max(libros.values())
titulo = [libro for libro, ejemplares in libros.items() if ejemplares == maximo]
return titulo
print(masEjemplares2(inventario))
Ejercicios tuplas y diccionarios
# Cread una función provincias() que nos devuelva una tupla con las provincias de Catalunya # utilizad desempaquetamiento para asignarlo a cuatro variables a,b,c,d # Recorred la tupla con un for # Cread una función descuentos que nos devuelva una tupla con descuentos de 5,10 y 20 # utilizad desempaquetamiento para: # obtener los 3 descuentos # obtener el primer descuento e ignorar los otros dos # Cread una función estadística a la que le pasamos una lista de números y nos devuelve una tupla # con la cantidad de números, la suma, y la media # estadistica([1,2,3,4])->(4,10,2.5) # Cread un diccionario para almacenar los datos de un cliente que son nombre Eva, email eva@eva.com # telefono 666777666 y credito 5000 # Cread una función a la que le pasamos un diccionario como el de los libros y nos devuelve el # título del libro que tenga más ejemplares
Ejemplos diccionarios
# Un diccionario es una estructura de datos que almacena un conjunto de pares
# clave, valor
# Es decir, no son valores únicos, sino que se componen de una clave y de un valor
# La clave es inmutable y el valor no
persona = {
"nombre": "Ana",
"edad": 30,
"profesion": "Ingeniera"
}
print(persona)
print(persona["edad"]) # 30
persona["edad"] = 32
print(persona)
persona["sueldo"] = 5000
print(persona)
# print(persona["foo"]) # Da error porque no hay esa clave
print(persona.get("foo")) # NO da error aunque no hay esa clave
print(persona.get("foo", "Sin valor")) # NO da error aunque no hay esa clave y le doy un valor por defecto
# probad a crear un diccionario para un alumno que tenga nombre, nota y curso
alumno = {
"nombre": "Ana",
"nota": 8,
"curso": "Bachillerato"
}
print(alumno.keys()) # Me devuelve todas las claves
print(alumno.values()) # Me devuelve todos los valores
print(alumno.items()) # Me devuelve todos los pares clave,valor
# recorrer un diccionario
for clave, valor in alumno.items():
print(f"La clave {clave} tiene el valor {valor}")
for i in alumno.items():
print(i)
# 1. Crear un diccionario con libros y su cantidad en inventario
inventario = {
"Cien años de soledad": 4,
"El Principito": 10,
"1984": 6
}
# 2. Añadir un nuevo libro
inventario["Don Quijote"] = 3
# 3. Modificar la cantidad de un libro existente
inventario["1984"] = 8
# 4. Eliminar un libro del inventario
del inventario["El Principito"] # inventario.pop("El Principito")
# 5. Recorrer el diccionario e imprimir el inventario
print("Inventario actual:")
for titulo, cantidad in inventario.items():
print(f"{titulo}: {cantidad} ejemplares")
# 6. Obtener solo los títulos disponibles
titulos = [titulo for titulo in inventario]
print("\nTítulos disponibles:", titulos)
# 7. Crear una lista de libros con más de 5 ejemplares
populares = [titulo for titulo, cantidad in inventario.items() if cantidad > 5]
print("\nLibros populares (más de 5 ejemplares):", populares)
# 8. Crear un nuevo diccionario con solo los libros escasos (3 o menos)
escasos = {titulo: cantidad for titulo, cantidad in inventario.items() if cantidad <= 3}
print("\nLibros escasos:", escasos)
Tuplas
# las tuplas son como las listas, pero inmutables
# No se pueden modificar
# Si las listas se definen con corchetes, las tuplas se definen con paréntesis
mitupla = (1, 2, 3, 4)
otratupla = ("Ana", "Pep", "Eva")
for numero in mitupla:
print(numero)
print(mitupla[1])
print(mitupla[-1])
print(mitupla[1:3])
def extremos(lista):
ordenada = sorted(lista) # [1,2,3,4,5,8]
return (ordenada[0], ordenada[-1])
print(extremos([2, 4, 1, 8, 5, 3]))
# desempaquetar tupla
menor, mayor = extremos([2, 4, 1, 8, 5, 3])
print((menor))
print((mayor))
i, j = extremos([2, 4, 1, 8, 5, 3])
print((i))
print((j))
# desempaqueto 4 valores
a, b, c, d = mitupla # a=1,b=2,c=3,d=4
print(c)
tupla = (2, 4, 8)
a, b, c = tupla # a=2, b=4, c=8
def foo():
return ("Sí", "No", "Quizás")
def tablairpf():
return (5, 10, 12, 18)
s, n, q = foo() # s="Sí", n="No", q="Quizás"
print(q)
bajo, medio, alto, superior = tablairpf()
# desempaquetar múltiples valores
b, *m, s = tablairpf()
print(b) # 5
print(m) # [10,12]
print(s) # 18
b, m, *s = tablairpf()
print(b) # 5
print(m) # 10
print(s) # [12, 18]
*_, m, s = tablairpf()
print(b) # [5, 10]
print(m) # 12
print(s) # 18
def suma(*numeros):
suma = 0
for numero in numeros:
suma += numero
return suma
print(suma(1, 2))
print(suma(1, 2, 4, 5, 7))
print(suma(1, 2, 4, 5, 7, 8, 9, 10))
s, n, _ = foo() # s="Sí", n="No", _ se ignora
Soluciones comprension
# Crea una lista con los cuadrados de los números del 1 al 10.
cuadrados = [numero ** 2 for numero in range(1, 11)]
print(cuadrados)
lista = [1.4, 5.6, 9.35]
cuadrados = [numero ** 2 for numero in lista]
print(cuadrados)
# Obtén una lista con los números del 0 al 20 que sean múltiplos de 3.
multiplos3 = [numero for numero in range(0, 21) if numero % 3 == 0]
print(multiplos3)
# Dada la lista ["Ana", "Luis", "Pedro"], obtén una lista con sus longitudes.
lista = ["Ana", "Luis", "Pedro"]
longitudes = [len(cadena) for cadena in lista]
print(longitudes)
# Crear una función fueraNegativos a la que le pasamos una lista y nos devuelve
# solo los positivos fueraNegativos ([3, -1, -7, 5, 0])->[3,5,0]
def fueraNegativos(lista):
resultado = [numero for numero in lista if numero >= 0]
return resultado
print(fueraNegativos([3, -1, -7, 5, 0]))
# Crea una función a la que se le pasa un límite y un número y nos devuelve una
# lista con todos los números hasta ese límite que son múltiplos de ese número
# listaMultiplos(10,4)->[4,8]
def listaMultiplos(limite, multiplo):
resultado = [numero for numero in range(1, limite + 1) if numero % multiplo == 0]
return resultado
print(listaMultiplos(10, 4)) # [4,8]
print(listaMultiplos(20, 3)) # [3,6,9,12,15,18]
# Crea una función a la que le pasamos un número y nos devuelve una lista
# con la tabla de multiplicar de ese número tablaMultiplicar(7)->[7,14,21,…70]
def tablaMultiplicar(numero):
resultado = [numero * n for n in range(1, 11)]
return resultado
def tablaMultiplicar2(numero):
resultado = [n for n in range(1, numero * 10 + 1) if n % numero == 0]
return resultado
print(tablaMultiplicar(7)) # [7, 14, 21, 28, 35, 42, 49, 56, 63, 70]
print(tablaMultiplicar2(7)) # [7, 14, 21, 28, 35, 42, 49, 56, 63, 70]
# Crea una función a la que le pasamos una lista de palabras y nos devuelve solo
# las que tengan vocales conVocales([“hola”,”qwfr”,”que”])->[“hola”,”que”]
def tieneVocal(cadena):
cadena = cadena.lower()
vocales = "aeiouáéíóúàèìòùü"
for vocal in vocales:
if vocal in cadena:
return True
return False
print(tieneVocal("hola")) # True
print(tieneVocal("gjhgjh")) # False
def conVocales(lista):
resultado = [cadena for cadena in lista if tieneVocal(cadena)]
return resultado
print(conVocales(["asasa", "jkhkjhk", "pepe", "sÍ", "üà"])) # ['asasa', 'pepe']
# Crea una función a la que le pasamos un límite y nos dice los números primos
# hasta ese límite
def esPrimo(numero):
for i in range(2, numero):
if numero % i == 0:
return False
return True
def primosHasta(limite):
resultado = [numero for numero in range(1, limite + 1) if esPrimo(numero)]
return resultado
print(primosHasta(100))
Ejercicios comprension
Nivel fácil
- Crea una lista con los cuadrados de los números del 1 al 10.
- Obtén una lista con los números del 0 al 20 que sean múltiplos de 3.
- Dada la lista
["Ana", "Luis", "Pedro"], obtén una lista con sus longitudes.
🔧 Nivel intermedio
- Crear una función fueraNegativos a la que le pasamos una lista y nos devuelve solo los positivos
fueraNegativos ([3, -1, -7, 5, 0])->[3,5,0] - Crea una función a la que se le pasa un límite y un número y nos devuelve una lista con todos los números hasta ese límite que son múltiplos de ese número listaMultiplos(10,4)->[4,8]
- Crea una función a la que le pasamos un número y nos devuelve una lista con la tabla de multiplicar de ese número tablaMultiplicar(7)->[7,14,21,…70]
🔬 Nivel avanzado
- Crea una función a la que le pasamos una lista de palabras y nos devuelve solo las que tengan vocales conVocales([«hola»,»qwfr»,»que»])->[«hola»,»que»]
Ejemplos comprension
def media(lista):
suma = 0
for numero in lista:
suma += numero
return (suma / len(lista))
def mediaAprobados2(lista):
aprobados = []
for numero in lista:
if numero >= 5:
aprobados.append(numero)
return media(aprobados)
# Filtro la lista con el if >=5, no hago ninguna expresión
def mediaAprobados3(lista):
aprobados = [nota for nota in lista if nota >= 5]
return media(aprobados)
def contarCadenas(lista, longitud):
# una variable donde contar
cont = 0
# recorrer la lista de cadenas
for cadena in lista:
# Si la cadena tiene una longitud mayor de 'longitud' contarla y si no hago nada
if len(cadena) > longitud:
cont += 1
return cont
# Filtro la lista por las que tengan una longitud mayor que la que me pasan
def contarCadenas2(lista, longitud):
# Palabras mayores de una longitud
mayores = [cadena for cadena in lista if len(cadena) > longitud]
# ¡Ojo! Devuelvo la longitud, porque estoy contando
return len(mayores)
def minusculas(lista):
resultado = []
for elemento in lista:
resultado.append(elemento.lower())
return resultado
# No hago ningún filtro, solo transformo a minúsculas
def minusculas2(lista):
minusculas = [cadena.lower() for cadena in lista]
return minusculas
def longitudPar(lista):
resultado = []
for elemento in lista:
if len(elemento) % 2 == 0:
resultado.append(elemento)
return resultado
# filtro las que tengan longitud par
def longitudPar2(lista):
resultado = [cadena for cadena in lista if len(cadena) % 2 == 0]
return resultado