La solicitud

De Megan Collins, Directora de Ventas
Tu objetivo
Corrige el código para que result sea un diccionario que asocie cada canal con el total promedio de sus pedidos (el total del canal dividido entre el número de pedidos de ese canal), redondeado a 2 decimales.
- 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
Un promedio es un total entre un conteo del mismo grupo
Para promediar por grupo a mano, mantienes dos diccionarios lado a lado: un total acumulado y un conteo acumulado para cada clave. Una sola pasada por los pedidos llena ambos:
for channel, total in orders:
totals[channel] = totals.get(channel, 0) + total
counts[channel] = counts.get(channel, 0) + 1
# totals: web 344.45, app 226.48, marketplace 273.25
# counts: web 4, app 4, marketplace 2
El promedio de un canal es su total dividido entre su propio conteo. La web es 344.45 / 4 = 86.11.
Dividir entre len(orders), que es 10, mezcla dos grupos: el dinero de la web con los pedidos de todos.
Eso da 34.45, un número que no describe nada real. Los tres «promedios» erróneos incluso suman el
promedio general de todos los pedidos ($84.42), lo que es una pista de que el denominador es
compartido.
Comprueba el sentido de cada promedio
No necesitas leer el código para saber que el starter está roto. Un promedio siempre está entre el valor más pequeño y el más grande de su grupo. El pedido web más pequeño de esta mañana fue de $57.80, así que una canasta web promedio de $34.45 es imposible. La misma prueba sirve para cada canal:
- los pedidos de app van de $38.40 a $95.10, así que el promedio de app debe estar en ese rango ($56.62 lo está);
- marketplace tiene dos pedidos, $61.25 y $212.00, así que su promedio queda a medio camino, $136.62.
Hacer este tipo de comprobación antes de enviar números toma segundos y evita correcciones vergonzosas.
Por qué los conteos estaban «bien» pero sin usar
Errores como este son comunes cuando el código se edita con el tiempo. Alguien añadió el diccionario
counts correctamente, pero la línea de la división se había escrito antes y se quedó con
len(orders). No falla nada, no hay error, y la salida tiene la forma correcta: un número por canal.
Solo los valores son erróneos, por eso conviene mirar los números y no solo si el script se ejecuta.
Errores comunes
- Dividir entre el número total de filas en lugar del conteo del grupo.
- Redondear los totales antes de dividir, lo que puede mover el último centavo.
- Reiniciar
totals = {}dentro del bucle, de modo que solo sobrevive el último pedido. Mantén los diccionarios vacíos encima del bucle.
¡Linterna encendida!
Practicaste: debuggingdictionariesaveragesaccumulator
- Resuelto
- Sin pistas
- Al primer intento
