# Cread una función tiradaDado que nos devuelva un número aleatorio del 1 al 6 # Cread una función que nos devuelva al azar una provincia de Cataluña # Cread una función que nos devuelva el año actual # Cread una función que nos devuelva True si hoy es viernes y false en caso contrario # Cread una función que nos devuelva la fecha actual en formato día/mes/año # Cread una función que nos devuelva el siguiente día laborable a partir de hoy
Soluciones ejercicios lambda
biblioteca = [
{"titulo": "El Quijote", "autor": "Cervantes", "precio": 20},
{"titulo": "Las olas", "autor": "Virginia Woolf", "precio": 17},
{"titulo": "Los detectives salvajes", "autor": "Roberto Bolaño", "precio": 23},
{"titulo": "Tom va a la escuela", "autor": "Rick Sánchez", "precio": 10}
]
# Para resolver los siguientes ejercicios podéis usar cualquier método de los vistos en clase
# Calcular la suma de todos los precios
# obtener precio
# Haciendo el bucle de toda la vida y sumando los precios
suma = 0
for libro in biblioteca:
suma += libro["precio"]
print(suma)
# Comprension de listas obteniendo solo el precio, entonces ya puedo usar 'sum'
precios = [libro["precio"] for libro in biblioteca]
print(sum(precios))
# Obteniendo los precios mediante el 'map' y una función lambda, después puedo usar 'sum'
precios = list(map(lambda x: x["precio"], biblioteca))
print(sum(precios))
# Queremos obtener el libro con el precio más alto
# Método tradicional con un for nos guardamos el más caro 'de momento'
libroCaro = None
precio = 0
for libro in biblioteca:
# Si encontramos uno más caro nos lo quedamos
if libro["precio"] > precio:
precio = libro["precio"]
libroCaro = libro
print(libroCaro)
# Usar max junto con lambda para que busque el máximo de la propiedad 'precio'
libroCaro = max(biblioteca, key=lambda x: x["precio"])
print(libroCaro)
# queremos ordenarlos por título
# Ordenamos mediante título usando una lambda
librosPorTitulo = sorted(biblioteca, key=lambda x: x["titulo"])
print(librosPorTitulo)
proyectos = [
{"nombre": "Análisis", "horas": 10, "precio": 60},
{"nombre": "Desarrollo", "horas": 50, "precio": 50},
{"nombre": "Implementación", "horas": 5, "precio": 70},
{"nombre": "Pruebas", "horas": 15, "precio": 40},
]
# Queremos calcular el coste total de todos los proyectos (horas*precio)
total = 0
for proyecto in proyectos:
total += proyecto["horas"] * proyecto["precio"]
print(total)
importes = [proyecto["horas"] * proyecto["precio"] for proyecto in proyectos]
print(sum(importes))
importes = list(map(lambda x: x["precio"] * x["horas"], proyectos))
print(sum(importes))
# El proyecto con mayor coste (horas*precio)
mayorCoste = max(proyectos, key=lambda proyecto: proyecto["precio"] * proyecto["horas"])
print(mayorCoste)
# ordenar por número de horas
porHoras = sorted(proyectos, key=lambda x: x["horas"])
print(porHoras)
# Filtrar los que cuesten más 1000 €
caros = [proyecto for proyecto in proyectos if proyecto["horas"] * proyecto["precio"] > 1000]
print(caros)
caros = list(filter(lambda x: x["horas"] * x["precio"] > 1000, proyectos))
print(caros)
Ejercicios lambda
biblioteca = [
{"titulo": "El Quijote", "autor": "Cervantes", "precio": 20},
{"titulo": "Las olas", "autor": "Virginia Woolf", "precio": 17},
{"titulo": "Los detectives salvajes", "autor": "Roberto Bolaño", "precio": 23},
{"titulo": "Tom va a la escuela", "autor": "Rick Sánchez", "precio": 10}
]
# Para resolver los siguientes ejercicios podéis usar cualquier método de los vistos en clase
# Calcular la suma de todos los precios
# Queremos obtener el libro con el precio más alto
# queremos ordenarlos por título
proyecto = [
{"nombre": "Análisis", "horas": 10, "precio": 60},
{"nombre": "Desarrollo", "horas": 50, "precio": 50},
{"nombre": "Implementación", "horas": 5, "precio": 70},
{"nombre": "Pruebas", "horas": 15, "precio": 40},
]
# Queremos calcular el coste total de todos los proyectos (horas*precio)
# El proyecto con mayor coste (horas*precio)
# ordenar por número de horas
# Filtrar los que cuesten más 1000 €
Ejemplos funciones lambda
alumnos = ["Ana", "Iu", "Eva", "Victoria", "Ramon"]
def ultimaLetra(cadena):
return cadena[-1]
ordenado = sorted(alumnos)
print(ordenado)
ordenado = sorted(alumnos, key=len)
print(ordenado)
ordenado = sorted(alumnos, key=ultimaLetra)
print(ordenado)
maslargo = max(alumnos, key=len)
print(maslargo)
maslargo = max(alumnos, key=ultimaLetra)
print(maslargo)
clase = [
{"nombre": "Ana", "nota": 7},
{"nombre": "Eva", "nota": 3},
{"nombre": "Iu", "nota": 6},
{"nombre": "Luis", "nota": 8},
{"nombre": "Pep", "nota": 5},
]
def getNota(elemento):
return elemento["nota"]
maslisto = max(clase, key=getNota)
print(maslisto)
peor = min(clase, key=getNota)
print(peor)
# Funciones lambda: Son funciones anónimas que se definen al momento
# lambda argumentos: expresion que se devuelve
maslisto = max(clase, key=lambda x: x["nota"])
print(maslisto)
# lo que hace el código de antes es recorrer la lista, obtener la nota de cada elemento
# ordenar por ese valor (es decir, por nota) y devolver el que tenga el valor máximo
suma_lambda = lambda x, y: x + y
print(suma_lambda(3, 4))
pornotas = sorted(clase, key=lambda alumno: alumno["nota"])
print(pornotas)
# Hay una función predefinida de python que es 'map'
# aplica una función a todos los elementos de un iterable
numeros = [1, 2, 3, 4, 5]
def cuadrado(x):
return x ** 2
cuadrados = list(map(cuadrado, numeros))
print(cuadrados)
cuadrados2 = list(map(lambda x: x ** 2, numeros))
print(cuadrados2)
aprobados = list(filter(lambda x: x["nota"] >= 5, clase))
print(aprobados)
notas = [10, 2, 3, 4, 5, 6, 7, 8, 9]
def esPar(numero):
return numero % 2 == 0
pares = []
for nota in notas:
if esPar(nota):
pares.append(nota)
print(pares)
pares2 = [nota for nota in notas if esPar(nota)]
print(pares2)
pares3 = list(filter(esPar, notas))
print(pares3)
# Reescribir esto sin usar esPar
pares = []
for nota in notas:
if nota % 2 == 0:
pares.append(nota)
print(pares)
pares2 = [nota for nota in notas if nota % 2 == 0]
print(pares2)
pares3 = list(filter(lambda nota: nota % 2 == 0, notas))
print(pares3)
pedidos = [{"producto": "Libro", "precio": 20}, {"producto": "Lápiz", "precio": 2},
{"producto": "Cuaderno", "precio": 5}, {"producto": "Tablet", "precio": 200},
{"producto": "Funda", "precio": 15}]
# pedidos de 20 de precio o más
masde20 = []
for pedido in pedidos:
if pedido["precio"] >= 20:
masde20.append(pedido)
print(masde20)
masde20b = [pedido for pedido in pedidos if pedido["precio"] >= 20]
print(masde20b)
masde20c = list(filter(lambda pedido: pedido["precio"] >= 20, pedidos))
print(masde20c)
Soluciones diccionarios y tuplas
alumnos = {
"Ana": [8, 6, 10],
"Luis": [5, 6, 7],
"Marta": [9, 8, 9],
"Eva": [9, 8, 9],
}
# Esto no se pedía, pero si queremos añadir notas personalizadas a cada alumno lo podemos hacer así
notasnuevas = [6, 7, 4, 8]
# Para guardar el que tenga la media más alta. Necesitamos la media para saber el valor
# y primerodelaclase para el nombre
mediaprimero = 0
primerodelaclase = ""
# recorrer un diccionario
for alumno, notas in alumnos.items():
media = sum(notas) / len(notas)
print(f"El alumno {alumno} tiene una nota media de {media:.2f}")
if media > mediaprimero:
mediaprimero = media
primerodelaclase = alumno
notas.append(notasnuevas.pop())
print("El primero de la clase es ", primerodelaclase) #
# No es recomendable. Por varias cosas, una, si añado alumnos ya no funciona
# Si tengo muchos alumnos se me juntan demasiadas líneas
# Y no vale decir 'Así pongo una nota individualizada' ;)
alumnos["Ana"].append(3)
alumnos["Luis"].append(3)
alumnos["Marta"].append(3)
alumnos.keys() # Las claves "Ana","Luis"...
alumnos.values() # Los valores [8, 6, 10],...
alumnos.items() # Los pares clave valor ("Ana",[8, 6, 10])....
alumnos # python me devuelve alumnos.keys()
inventario = {
"frutas": ["manzana", "pera", "plátano"],
"verduras": ["zanahoria", "brócoli"],
"bebidas": ["agua", "zumo"]
}
# Añade "sandía" a la categoría de frutas.
inventario["frutas"].append("sandía")
print(inventario)
# Imprime todos los productos (uno por línea).
for productos in inventario.values():
for producto in productos:
print(producto)
# Cuenta cuántos productos hay en total.
numproductos = 0
for productos in inventario.values():
numproductos += len(productos)
print(numproductos)
# 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
pedidos = datos[cliente]
total = 0
for pedido in pedidos:
total += pedido["precio"]
return total
def total_gastado_c(cliente, datos):
return sum([pedido["precio"] for pedido in datos[cliente]])
def productosPorCliente(
datos): # nos devuelve un diccionario donde la clave es el nombre del cliente y el valor es el número de productos
resultado = {}
for clave, valor in datos.items():
resultado[clave] = len(valor)
return resultado
def productosPorCliente_c(
datos): # nos devuelve un diccionario donde la clave es el nombre del cliente y el valor es el número de productos
return {clave:len(valor) for clave, valor in datos.items()}
# Para saber si un diccionario ya tiene una clave usamos ‘in’ como en las listas
# if "Ana" in clientes:
print(total_gastado("Luis", clientes))
print(total_gastado_c("Luis", clientes))
print(productosPorCliente(clientes))
print(productosPorCliente_c(clientes))
Vídeos de las clases Python
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