Saltar a contenido

Notas

Suponga que tiene un string con el siguiente formato:

datos = "nombre1 apellido1:curso1=nota1,curso2=nota2;nombre2 apellido2:curso1=nota1;..."

De antemano no se sabe cuántos estudiantes aparecen en el texto, ni cuántos cursos asociados tiene cada uno, podría incluso no tener ninguno.

Necesitamos crear la función obtener_datos(notas) que permita recibir un texto con ese formato y devolver un diccionario con la siguiente estructura:

{
    'nombre1 apellido1': [
        [nota1, curso1],
        [nota2, curso2],
    ],
    'nombre2 apellido2': [
        [nota1, curso1]
    ],
    #...
}

La lista con las notas para cada estudiante debe estar ordenada de menor a mayor de acuerdo a sus notas.

Ejemplos

datos = "Carlos Pérez:cálculo=85,física=92;María González:programación=74;José Ramírez:mecánica=68,cálculo=95,álgebra=81;Ana Torres:termodinámica=77,química=88,electricidad=91"

>>> obtener_notas(datos)
{
    'Carlos Pérez': [[85, 'cálculo'], [92, 'física']], 
    'María González': [[74, 'programación']], 
    'José Ramírez': [[68, 'mecánica'], [81, 'álgebra'], [95, 'cálculo']], 
    'Ana Torres': [[77, 'termodinámica'], [88, 'química'], [91, 'electricidad']]
}
datos = "Carlos Pérez:cálculo=85,física=92;María González:programación=74;José Ramírez:mecánica=68,cálculo=95,álgebra=81;Ana Torres:termodinámica=77,química=88,electricidad=91"

>>> obtener_notas(datos)
{
    'Luis Martínez': [[85, 'geografía'], [90, 'historia']], 
    'Sofía López': [[79, 'física'], [88, 'biología'], [92, 'química']], 
    'Miguel Sánchez': [[95, 'matemáticas']]
}
Solución
def obtener_notas(datos):
    notas = {} # Diccionario para almacenar las notas
    datos = datos.split(";") # Separar los datos por ";" para obtener cada estudiante
    for estudiante in datos: # Iterar sobre cada estudiante
        tmp = estudiante.split(":") # Separar el nombre de las notas
        nombre = tmp[0] # Nombre del estudiante
        notas_estudiante = tmp[1].split(",") # Separar las notas por ","
        notas[nombre] = [] # Inicializar la lista de notas para el estudiante
        for c in notas_estudiante: # Iterar sobre cada nota
            nota_curso = c.split("=") # Separar la nota del curso
            curso = nota_curso[0] # Curso
            nota = int(nota_curso[1]) # Nota (convertir a entero)
            notas[nombre].append([nota, curso]) # Agregar la nota a la lista del estudiante
            notas[nombre].sort() # Ordenar las notas de menor a mayor
    return notas

datos1 =  "Carlos Pérez:cálculo=85,física=92;María González:programación=74;José Ramírez:mecánica=68,cálculo=95,álgebra=81;Ana Torres:termodinámica=77,química=88,electricidad=91"
datos2 = "Luis Martínez:historia=90,geografía=85;Sofía López:biología=88,química=92,física=79;Miguel Sánchez:matemáticas=95"
print(obtener_notas(datos1))
print(obtener_notas(datos2))