Saltar a contenido

Notas

El profesor de una asignatura de la USM registra las notas de sus alumnos en una lista como la siguiente:

alumnos = [
    ['Alberto Gonzalez', 40, 30, 70], 
    ['Francisca Almonacid', 100, 40],
    ['Pedro Reyes', 30, 50],
    ['Juan Campos', 30, 60, 30, 70],
    ['Andrea Zamora', 30],
    #...
]

Los datos que se almacenan, para cada alumno, son el nombre y una cantidad variable de notas. Como se ve en el ejemplo, la cantidad de notas puede variar de un alumno a otro.

Se le pide que escriba las siguientes funciones:

  1. La función calcular_promedio(alumnos) que recibe la lista alumnos con la estructura que se indicó, y retorna una nueva lista que contiene el nombre y el promedio de cada alumno.
  2. La funcion mejor_promedio(alumnos) que entrega el nombre del alumno con mejor promedio. Si hay varios alumnos empatados con el mejor promedio, la función retorna alguno de ellos, sin importar cuál.

Ejemplos:

Pregunta 1.

>>> calcular_promedio(alumnos)
[ ['Alberto Gonzalez', 47], ['Francisca Almonacid', 70],
    ['Pedro Reyes', 40], ['Juan Campos', 48], ['Andrea Zamora', 30]
]

Pregunta 2.

>>> mejor_promedio(alumnos)
'Francisca Almonacid'

Solución
def calcular_promedio(alumnos):
    resultado = []
    for alumno in alumnos:
        nombre = alumno[0]
        notas = alumno[1:]  # Todas las notas (desde índice 1 en adelante)
        promedio = round(sum(notas) / len(notas))  # Promedio redondeado al entero más cercano
        # Agregar [nombre, promedio] a la lista resultado
        resultado.append([nombre, promedio])
    return resultado


def mejor_promedio(alumnos):
    # Primero calculamos los promedios
    promedios = calcular_promedio(alumnos)
    # Inicializamos con el primer alumno
    mejor_nombre = promedios[0][0]
    mejor_prom = promedios[0][1]
    # Buscamos el mejor promedio
    for alumno_promedio in promedios:
        nombre = alumno_promedio[0]
        promedio = alumno_promedio[1]
        if promedio > mejor_prom:
            mejor_prom = promedio
            mejor_nombre = nombre
    return mejor_nombre


# Lista de alumnos con sus notas
alumnos = [
    ['Alberto Gonzalez', 40, 30, 70],
    ['Francisca Almonacid', 100, 40],
    ['Pedro Reyes', 30, 50],
    ['Juan Campos', 30, 60, 30, 70],
    ['Andrea Zamora', 30]
]

# Prueba de calcular_promedio
promedios = calcular_promedio(alumnos)
print("Promedios de alumnos:", promedios)

# Prueba de mejor_promedio
mejor = mejor_promedio(alumnos)
print("Alumno con mejor promedio:", mejor)