Lección 1 · 1 de 20
Comprensiones de listas, diccionarios y conjuntos · Python
Cree listas, diccionarios y conjuntos en una sola línea con las comprensiones de Python, con filtros y desempaquetado. Pruébelo en DMarlon Studio.

Una comprensión construye una colección nueva a partir de otra sin escribir el bucle completo. [qty * price for _, _, qty, price in orders] recorre los pedidos, desempaqueta cada tupla y guarda el total de cada línea. El guion bajo _ es el nombre habitual para los valores que no se usan.
Al final se puede añadir un filtro con if: la lista big solo guarda las líneas cuyo importe llega a 30, y la expresión del principio (aquí, la f-string f"{name}/{item}") decide qué se guarda de cada una.
Con llaves y un solo valor se obtiene una comprensión de conjunto: {item for _, item, _, _ in orders} deja cada producto una sola vez. Los conjuntos no tienen orden fijo, por eso el programa los pasa por sorted() antes de escribirlos.
Con llaves y clave: valor se obtiene una comprensión de diccionario. spent asocia a cada cliente lo que ha gastado, y dentro lleva otra comprensión (una expresión generadora dentro de sum()). La última, cheap, recorre prices.items() y da la vuelta al diccionario: el precio pasa a ser la clave.
Las comprensiones son más rápidas y legibles que un bucle con append() cuando el resultado cabe en una línea. Si necesita varias condiciones encadenadas o efectos secundarios (escribir, guardar), un bucle normal se entiende mejor.
Código · main.py
# Orders from an online shop: (customer, product, quantity, unit price)orders = [ ("Ana", "keyboard", 2, 25.0), ("Luis", "mouse", 1, 12.5), ("Ana", "monitor", 1, 180.0), ("Marta", "mouse", 3, 12.5), ("Luis", "cable", 4, 3.0),]# List comprehension: one total per order linetotals = [qty * price for _, _, qty, price in orders]print("Line totals:", totals)# With a condition: only the lines worth 30 or morebig = [f"{name}/{item}" for name, item, qty, price in orders if qty * price >= 30]print("Big lines:", big)# Set comprehension: each product only once (sorted to print it)products = {item for _, item, _, _ in orders}print("Products:", sorted(products))# Dict comprehension: customer -> amount spentcustomers = sorted({name for name, *_ in orders})spent = {c: sum(q * p for n, _, q, p in orders if n == c) for c in customers}print("Spent:", spent)# Turn a dict around: price -> product, for the cheap itemsprices = {"keyboard": 25.0, "mouse": 12.5, "cable": 3.0, "monitor": 180.0}cheap = {price: item for item, price in prices.items() if price < 20}print("Cheap:", cheap)Salida · python3 main.py
Line totals: [50.0, 12.5, 180.0, 37.5, 12.0]
Big lines: ['Ana/keyboard', 'Ana/monitor', 'Marta/mouse']
Products: ['cable', 'keyboard', 'monitor', 'mouse']
Spent: {'Ana': 230.0, 'Luis': 24.5, 'Marta': 37.5}
Cheap: {12.5: 'mouse', 3.0: 'cable'}Para recordar
[expr for x in datos if condición]crea una lista.{expr for x in datos}crea un conjunto, sin repetidos.{clave: valor for x in datos}crea un diccionario.- Se puede desempaquetar en el
for:for nombre, *_ in pedidos. - Si la comprensión no cabe en una línea, mejor un bucle.
Ejercicio
Añada un diccionario units que asocie a cada producto el total de unidades vendidas (por ejemplo, mouse debe dar 4) usando una comprensión de diccionario.