MAD- UdelaR: Ejercicios de List & Dict Comprehensions
Daniel Miles Touya
Realiza los Ejercicios en celdas sucesivas de Jupyter Notebook
La solución es una de las posibles (no hay una sola respuesta)
Conceptos Clave sobre Comprehensions
Comprehensions: Forma concisa y elegante de crear listas y diccionarios.
Sintaxis básica:[expresion for item in iterable]{key: value for item in iterable}
Con condicionales:if condicionexpresion if condicion else otra
Ventajas: Más rápidas, más legibles, más "pythónicas"
1
List comprehension básica
Fácil
Problema: Crea una lista con los cuadrados de los números del 1 al 5 usando list comprehension.
✅ Solución:
# Con list comprehension
cuadrados = [x**2 for x in range(1, 6)]
print(cuadrados)
# Resultado: [1, 4, 9, 16, 25]
📚 Comparación con bucle tradicional:
# Forma tradicional
cuadrados = []
for x in range(1, 6):
cuadrados.append(x**2)
Explicación: List comprehension permite crear listas en una sola línea. Sintaxis: [expresión for variable in iterable]
2
List comprehension con if
Fácil
Problema: Crea una lista con solo los números pares del 1 al 20 usando list comprehension con condición.
✅ Solución:
# Con list comprehension y filtro
pares = [x for x in range(1, 21) if x % 2 == 0]
print(pares)
# Resultado: [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
Explicación: Agregamos if condición al final para filtrar elementos. Solo incluye elementos que cumplen la condición.
3
Transformar strings
Fácil
Problema: Tienes una lista palabras = ["python", "java", "javascript"]. Crea una nueva lista con todas las palabras en mayúsculas usando comprehension.
✅ Solución:
palabras = ["python", "java", "javascript"]
# Con list comprehension
mayusculas = [palabra.upper() for palabra in palabras]
print(mayusculas)
# Resultado: ['PYTHON', 'JAVA', 'JAVASCRIPT']
Explicación: Podemos aplicar métodos a cada elemento durante la transformación. Aquí usamos .upper() en cada palabra.
4
Dictionary comprehension básica
Fácil
Problema: Crea un diccionario donde las claves sean números del 1 al 5 y los valores sean sus cubos usando dictionary comprehension.
✅ Solución:
# Con dictionary comprehension
cubos = {x: x**3 for x in range(1, 6)}
print(cubos)
# Resultado: {1: 1, 2: 8, 3: 27, 4: 64, 5: 125}
📚 Forma tradicional:
cubos = {}
for x in range(1, 6):
cubos[x] = x**3
Explicación: Dictionary comprehension sintaxis: {clave: valor for variable in iterable}
5
Filtrar con longitud de strings
Fácil
Problema: Tienes una lista nombres = ["Ana", "Juan", "María", "José", "Carmen"]. Crea una lista solo con nombres que tengan más de 4 letras.
✅ Solución:
nombres = ["Ana", "Juan", "María", "José", "Carmen"]
# Filtrar nombres largos
nombres_largos = [nombre for nombre in nombres if len(nombre) > 4]
print(nombres_largos)
# Resultado: ['María', 'Carmen']
Explicación: Usamos len() en la condición para filtrar por longitud de caracteres.
6
Comprehension con if-else
Medio
Problema: Crea una lista con números del 1 al 10, pero si el número es par muestra "PAR", si es impar muestra "IMPAR".
✅ Solución:
# Con if-else en la expresión
resultado = ["PAR" if x % 2 == 0 else "IMPAR" for x in range(1, 11)]
print(resultado)
# Resultado: ['IMPAR', 'PAR', 'IMPAR', 'PAR', 'IMPAR', 'PAR', 'IMPAR', 'PAR', 'IMPAR', 'PAR']
# Con números y etiquetas
resultado_detalle = [f"{x}-PAR" if x % 2 == 0 else f"{x}-IMPAR" for x in range(1, 11)]
print(resultado_detalle)
Explicación: Cuando usamos if-else en la expresión (no al final), va antes del for. Sintaxis: expresion_si_true if condicion else expresion_si_false
7
Dictionary desde dos listas
Medio
Problema: Tienes dos listas: estudiantes = ["Ana", "Juan", "María"] y notas = [85, 92, 78]. Crea un diccionario usando comprehension.
✅ Solución:
estudiantes = ["Ana", "Juan", "María"]
notas = [85, 92, 78]
# Crear diccionario con zip
calificaciones = {estudiante: nota for estudiante, nota in zip(estudiantes, notas)}
print(calificaciones)
# Resultado: {'Ana': 85, 'Juan': 92, 'María': 78}
Explicación: Usamos zip() para emparejar elementos de dos listas y crear un diccionario con comprehension.
8
Filtrar diccionario
Medio
Problema: Tienes un diccionario precios = {"manzana": 1.5, "pan": 2.0, "leche": 1.2, "carne": 8.5}. Crea un nuevo diccionario solo con productos que cuesten menos de 2€.
Explicación: Usamos .items() para obtener pares clave-valor y filtramos con una condición en el precio.
9
Nested comprehension básica
Medio
Problema: Crea una lista plana con todos los números de estas listas anidadas: matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
✅ Solución:
matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# Aplanar matriz con nested comprehension
plana = [numero for fila in matriz for numero in fila]
print(plana)
# Resultado: [1, 2, 3, 4, 5, 6, 7, 8, 9]
📚 Forma tradicional:
plana = []
for fila in matriz:
for numero in fila:
plana.append(numero)
Explicación: En nested comprehension, los bucles se leen de izquierda a derecha como si fueran bucles anidados normales.
10
Comprehension con funciones
Medio
Problema: Crea una lista con las longitudes de estas palabras: palabras = ["Python", "es", "genial", "para", "programar"]
✅ Solución:
palabras = ["Python", "es", "genial", "para", "programar"]
# Obtener longitudes
longitudes = [len(palabra) for palabra in palabras]
print(longitudes)
# Resultado: [6, 2, 6, 4, 9]
# Con diccionario palabra -> longitud
palabra_longitud = {palabra: len(palabra) for palabra in palabras}
print(palabra_longitud)
Explicación: Podemos usar cualquier función en la expresión de la comprehension, como len(), str.upper(), etc.
11
Múltiples condiciones
Medio
Problema: Del 1 al 30, crea una lista con números que sean divisibles por 3 Y por 2 (o sea, divisibles por 6).
✅ Solución:
# Números divisibles por 6
divisibles_6 = [x for x in range(1, 31) if x % 3 == 0 and x % 2 == 0]
print("Divisibles por 3 Y 2:", divisibles_6)
# Más directo
divisibles_6_directo = [x for x in range(1, 31) if x % 6 == 0]
print("Divisibles por 6:", divisibles_6_directo)
# Con detalles
detalles = [f"{x} (3×{x//3}, 2×{x//2})" for x in range(1, 31) if x % 6 == 0]
print("Con detalles:", detalles)
Explicación: Podemos usar operadores lógicos (and, or) en las condiciones del filtro.
12
Procesar texto
Medio
Problema: Tienes una frase "Python es un lenguaje increíble". Crea una lista con las palabras que tengan más de 2 caracteres, todas en mayúsculas.
✅ Solución:
frase = "Python es un lenguaje increíble"
# Palabras largas en mayúsculas
palabras_largas = [palabra.upper() for palabra in frase.split() if len(palabra) > 2]
print(palabras_largas)
# Resultado: ['PYTHON', 'LENGUAJE', 'INCREÍBLE']
# Con información extra
detalle = [f"{palabra} ({len(palabra)} letras)" for palabra in frase.split() if len(palabra) > 2]
print("Con detalles:", detalle)
Explicación: Combinamos .split() para separar palabras, filtro por longitud y transformación con .upper().
13
Set comprehension
Fácil
Problema: Crea un set con las primeras letras (en minúscula) de estas palabras: palabras = ["Python", "Java", "JavaScript", "PHP", "Perl"]
✅ Solución:
palabras = ["Python", "Java", "JavaScript", "PHP", "Perl"]
# Set comprehension - elimina duplicados automáticamente
primeras_letras = {palabra[0].lower() for palabra in palabras}
print(primeras_letras)
# Resultado: {'p', 'j'} - solo letras únicas
# Lista para ver todas (con duplicados)
todas_primeras = [palabra[0].lower() for palabra in palabras]
print("Con duplicados:", todas_primeras)
Explicación: Set comprehension usa {} como list comprehension pero elimina duplicados automáticamente.
14
Nested comprehension con filtro
Difícil
Problema: Tienes una matriz de números. Crea una lista plana solo con los números pares: matriz = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
✅ Solución:
matriz = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
# Nested comprehension con filtro
pares = [numero for fila in matriz for numero in fila if numero % 2 == 0]
print(pares)
# Resultado: [2, 4, 6, 8, 10, 12]
📚 Forma tradicional:
pares = []
for fila in matriz:
for numero in fila:
if numero % 2 == 0:
pares.append(numero)
Explicación: Combinamos nested comprehension con filtro. El orden es: bucles anidados, luego condición al final.
15
Comprehension con enumerate
Medio
Problema: Tienes una lista colores = ["rojo", "azul", "verde", "amarillo"]. Crea un diccionario donde la clave sea el índice y el valor sea el color, pero solo para colores con más de 4 letras.
✅ Solución:
colores = ["rojo", "azul", "verde", "amarillo"]
# Dictionary comprehension con enumerate y filtro
colores_largos = {i: color for i, color in enumerate(colores) if len(color) > 4}
print(colores_largos)
# Resultado: {2: 'verde', 3: 'amarillo'}
# Versión con índice personalizado (empezar desde 1)
colores_desde_1 = {i+1: color for i, color in enumerate(colores) if len(color) > 4}
print("Desde 1:", colores_desde_1)
Explicación:enumerate() nos da índice y valor. Útil para crear diccionarios con posiciones como claves.
16
Transformar valores en diccionario
Medio
Problema: Tienes un diccionario temperaturas = {"Madrid": 22, "Barcelona": 25, "Sevilla": 30}. Crea un nuevo diccionario con las temperaturas en Fahrenheit.
✅ Solución:
temperaturas = {"Madrid": 22, "Barcelona": 25, "Sevilla": 30}
# Convertir a Fahrenheit: F = C * 9/5 + 32
fahrenheit = {ciudad: round(temp * 9/5 + 32, 1) for ciudad, temp in temperaturas.items()}
print(fahrenheit)
# Resultado: {'Madrid': 71.6, 'Barcelona': 77.0, 'Sevilla': 86.0}
# Con formato más descriptivo
formato_completo = {f"{ciudad} (°F)": f"{round(temp * 9/5 + 32, 1)}°F"
for ciudad, temp in temperaturas.items()}
print("Formato completo:", formato_completo)
Explicación: Transformamos valores aplicando una fórmula matemática y usamos round() para redondear decimales.
17
Crear tabla de multiplicar
Difícil
Problema: Crea una lista de listas que represente la tabla de multiplicar del 1 al 5 (cada sublista es una tabla completa).
✅ Solución:
# Tabla de multiplicar completa
tabla_multiplicar = [[i * j for j in range(1, 6)] for i in range(1, 6)]
# Mostrar tabla
for i, fila in enumerate(tabla_multiplicar, 1):
print(f"Tabla del {i}: {fila}")
print("\nFormato más visual:")
# Versión más visual
for i in range(1, 6):
tabla = [f"{i}x{j}={i*j}" for j in range(1, 6)]
print(f"Tabla del {i}: {tabla}")
# Como diccionario
tablas_dict = {i: [i * j for j in range(1, 6)] for i in range(1, 6)}
print(f"\nComo diccionario: {tablas_dict}")
Explicación: Nested comprehension donde el bucle externo crea cada tabla y el interno los productos de esa tabla.
18
Análisis de datos con comprehension
Difícil
Problema: Tienes una lista de estudiantes con sus notas: estudiantes = [("Ana", 85), ("Juan", 92), ("María", 78), ("Pedro", 65), ("Laura", 95)]. Crea diferentes análisis usando comprehensions.
✅ Solución:
estudiantes = [("Ana", 85), ("Juan", 92), ("María", 78), ("Pedro", 65), ("Laura", 95)]
# 1. Diccionario nombre -> nota
notas_dict = {nombre: nota for nombre, nota in estudiantes}
print("Diccionario:", notas_dict)
# 2. Lista de estudiantes aprobados (nota >= 80)
aprobados = [nombre for nombre, nota in estudiantes if nota >= 80]
print("Aprobados:", aprobados)
# 3. Lista con calificaciones textuales
calificaciones = [f"{nombre}: {'EXCELENTE' if nota >= 90 else 'BUENO' if nota >= 80 else 'REGULAR' if nota >= 70 else 'INSUFICIENTE'}"
for nombre, nota in estudiantes]
print("Calificaciones:")
for calif in calificaciones:
print(f" {calif}")
# 4. Estadísticas básicas
notas_solo = [nota for nombre, nota in estudiantes]
estadisticas = {
'promedio': sum(notas_solo) / len(notas_solo),
'maxima': max(notas_solo),
'minima': min(notas_solo),
'aprobados_count': len([nota for nota in notas_solo if nota >= 80])
}
print("Estadísticas:", estadisticas)
Explicación: Múltiples comprehensions para diferentes análisis: diccionarios, filtros, transformaciones complejas con if-else anidados.
19
Procesar datos anidados
Difícil
Problema: Tienes datos de ventas por mes: ventas = {"Enero": [100, 150, 200], "Febrero": [120, 180, 250], "Marzo": [90, 160, 220]}. Calcula el total por mes y encuentra el mejor día de cada mes.
✅ Solución:
ventas = {"Enero": [100, 150, 200], "Febrero": [120, 180, 250], "Marzo": [90, 160, 220]}
# 1. Total por mes
totales_mes = {mes: sum(dias) for mes, dias in ventas.items()}
print("Totales por mes:", totales_mes)
# 2. Mejor día (venta máxima) por mes
mejores_dias = {mes: max(dias) for mes, dias in ventas.items()}
print("Mejor día por mes:", mejores_dias)
# 3. Promedio por mes
promedios = {mes: round(sum(dias) / len(dias), 2) for mes, dias in ventas.items()}
print("Promedios:", promedios)
# 4. Días con ventas superiores al promedio de cada mes
dias_buenos = {mes: [dia for dia in dias if dia > sum(dias)/len(dias)]
for mes, dias in ventas.items()}
print("Días sobre promedio:", dias_buenos)
# 5. Reporte completo
reporte = {mes: {
'total': sum(dias),
'promedio': round(sum(dias)/len(dias), 2),
'maximo': max(dias),
'minimo': min(dias)
} for mes, dias in ventas.items()}
print("\nReporte completo:")
for mes, stats in reporte.items():
print(f"{mes}: {stats}")
Explicación: Comprehensions complejas con múltiples operaciones: suma, promedio, máximo, filtros y estructuras anidadas.
20
Generador de coordenadas
Difícil
Problema: Crea todas las coordenadas (x, y) posibles donde x va de 0 a 3 y y va de 0 a 2, pero excluye las coordenadas donde x = y. Después crea un diccionario con la distancia desde el origen.
✅ Solución:
import math
# 1. Generar coordenadas con restricción
coordenadas = [(x, y) for x in range(4) for y in range(3) if x != y]
print("Coordenadas (x≠y):", coordenadas)
# 2. Todas las coordenadas para comparar
todas_coordenadas = [(x, y) for x in range(4) for y in range(3)]
print("Todas las coordenadas:", todas_coordenadas)
# 3. Coordenadas excluidas
excluidas = [(x, y) for x in range(4) for y in range(3) if x == y]
print("Excluidas (x=y):", excluidas)
# 4. Diccionario con distancias desde origen
distancias = {(x, y): round(math.sqrt(x**2 + y**2), 2)
for x in range(4) for y in range(3) if x != y}
print("\nDistancias desde origen:")
for coord, dist in distancias.items():
print(f" {coord}: {dist}")
# 5. Coordenadas ordenadas por distancia
coords_ordenadas = sorted(distancias.items(), key=lambda item: item[1])
print("\nOrdenadas por distancia:")
for coord, dist in coords_ordenadas:
print(f" {coord}: {dist}")
# 6. Análisis adicional
cerca_origen = {coord: dist for coord, dist in distancias.items() if dist < 2.0}
print(f"\nCerca del origen (distancia < 2.0): {cerca_origen}")
lejos_origen = {coord: dist for coord, dist in distancias.items() if dist >= 3.0}
print(f"Lejos del origen (distancia >= 3.0): {lejos_origen}")
Explicación: Comprehension avanzada con múltiples bucles, condiciones complejas, cálculos matemáticos y análisis de datos resultantes.