La solicitud

De Megan Collins, Directora de Ventas
Tu objetivo
Asigna a result un diccionario con las claves 'total_units' (suma de unidades, int), 'n_products' (número de productos, int), 'best_seller' (nombre con más unidades), 'slowest' (nombre con menos unidades) y 'top3' (una lista de tres strings como "1. Fern Rattan Desk Lamp": los productos con mayor unidades * precio, el más alto primero, numerados del 1 al 3).
- Guarda un dict en
resultpendiente
Tu código
Cargando el editor…
Solución de referencia
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Megan, y por qué
La lección
Las funciones integradas que hacen el conteo
Python trae un puñado de funciones que usarás en casi todos los scripts, sin necesidad de importar nada:
units = [row[1] for row in week]
sum(units) # 271
len(week) # 6
max(units) # 102
min(units) # 9
sorted(units) # [9, 15, 41, 46, 58, 102] a new list, smallest first
sum también acepta directamente un generador, sum(row[1] for row in week), así que no necesitas la
lista extra. sorted devuelve una lista nueva y deja la original intacta, a diferencia de .sort(),
que reordena la lista en el sitio.
lambda: una función diminuta para una key
max(units) te dice el número más grande, pero no qué producto lo vendió. Para obtener el producto, dale
a max las filas completas y una key: una función que indique qué comparar. Una lambda escribe esa
función en línea, en una expresión:
max(week, key=lambda row: row[1]) # ('Hazel Linen Throw Pillow', 102, 20.99)
min(week, key=lambda row: row[1]) # ('Tidewater Concrete String Lights', 9, 379.0)
lambda row: row[1] significa «toma una fila, devuelve sus unidades». Es lo mismo que un def con una
sola línea return, sin nombre. La key también puede calcular, que es como clasificas por ingresos:
sorted(week, key=lambda row: row[1] * row[2], reverse=True)
La lámpara de escritorio vende solo 15 unidades pero a $379 aporta $5,685, lo máximo esta semana. El cojín, el más vendido por unidades, es el quinto por ingresos ($2,140.98). Qué «mejor» informas depende de la pregunta, así que nombra la medida.
range para numerar
range(start, stop) produce números enteros desde start hasta stop, sin incluirlo. range(1, 4) es
1, 2, 3, que son exactamente los puestos de un top tres:
[f"{i}. {by_revenue[i - 1][0]}" for i in range(1, 4)]
Los puestos empiezan en 1 pero las posiciones de la lista empiezan en 0, de ahí el i - 1. range
también admite un paso: range(0, 14, 7) da 0 y 7, el primer día de cada semana en una ventana de dos
semanas. Y range(len(week)) recorre las posiciones 0 a 5, que verás en código antiguo que itera por
índice. Recorrer directamente las filas, como arriba, suele ser más claro.
Errores comunes
- Llamar a
max(week)sin key. Las tuplas se comparan por su primer elemento, el nombre, así que obtienes “Tidewater Concrete String Lights” porque la T va la última en el alfabeto. - Olvidar
reverse=True, lo que pone primero los ingresos más pequeños. range(1, 3)para un top tres. El valor final se excluye.
¡Linterna encendida!
Practicaste: built in functionslambdasortedmax min keyrange
- Resuelto
- Sin pistas
- Al primer intento
