muy bueno el reto, este y el anterior fueron verdaderos desafíos para mí, ahi es donde confirmo que de nada sirve ver los cursos sin una constante aplicación.
def get_student_average(students): classStudents = {"class_average" : 0, "students": []} averageClass = 0 for i in students: student = { "name" : i["name"], "average" : round(sum(i["grades"])/len(i["grades"]), 2) } averageClass += student["average"] classStudents["students"].append(student) classStudents["class_average"] = round(averageClass/len(students), 2) return classStudents get_student_average([ { "name": "Pedro", "grades": [90, 87, 88, 90], }, { "name": "Jose", "grades": [99, 71, 88, 96], }, { "name": "Maria", "grades": [92, 81, 80, 96], }, ])
Gracias por compartir Gabriel
Estuvo buenísimo este. Les comparto mi solución y la refactorización
.``` . . . . . . . . . .
def get_student_average(students): #diccionario final newDict = {} #valores para el promedio general averageClass = [] #agregar promedios individuales para calcular el promedio general for item in students: values = sum(item["grades"]) / len(item["grades"]) averageClass.append(values) #generar el listado de estudiantes y promedios newStudentsDict = [{"name": item["name"], "average": round(sum(item["grades"]) / len(item["grades"]), 2)} for item in students] #modificar el diccionario final con valores newDict["class_average"] = round(sum(averageClass) / len(averageClass),2) newDict["students"] = newStudentsDict return newDict
Refactor
def get_student_average(students): #promedio general promedio_general = round(sum(sum(student["grades"]) / len(student["grades"]) for student in students) / len(students), 2) #generar el listado de estudiantes y promedios newStudentsDict = [{"name": item["name"], "average": round(sum(item["grades"]) / len(item["grades"]), 2)} for item in students] return {"class_average": promedio_general, "students": newStudentsDict}
me gustó mucho como abordaste el ejercicio!
Qué emoción lo revisé le ajuste la parte en donde armaba la lista y paso la prueba, i'm very happy:
def get_student_average(students): students_result = [] #students_result: lista donde guardamos cada estudiante con su promedio total_average_sum = 0 #total_average_sum: suma de todos los promedios individuales # Calcular promedio de cada estudiante for student in students: average = sum(student["grades"]) / len(student["grades"]) #sum() suma las notas / len() cuenta cuántas hay average = round(average, 2) #round(..., 2) redondea a 2 decimales #Creamos un nuevo diccionario, no modificamos el original students_result.append({ "name": student["name"], "average": average }) #Sumamos para el promedio general total_average_sum += average # Calcular promedio general de la clase class_average = round(total_average_sum / len(students), 2) #Resultado final return { "class_average": class_average, "students": students_result } print(get_student_average([ {"name": "Pedro", "grades": [90, 87, 88, 90]}, {"name": "Jose", "grades": [99, 71, 88, 96]}, {"name": "Maria", "grades": [92, 81, 80, 96]}, ]))
el mio def get_student_average(students):
resultado = {
'class_average': round(sum(sum(student['grades']) for student in students) / sum(len(student['grades']) for student in students),2),
'students':[
{
'name': student['name'],
'average': round(sum(student['grades']) / len(student['grades']),2)
} for student in students
]
}
return resultado
def get_student_average(students:list): output = {"class_average" : 0, "students" : []} for student in students: output["students"].append({"name": student["name"] , "average" : round(sum(student["grades"])/len(student["grades"]),2)}) output["class_average"] += round(sum(student["grades"])/len(student["grades"]),2) output["class_average"] = round(output["class_average"] / len(output["students"]) ,2) return output
Da el resultado pero no lo acepta:def get_student_average(students): # Tu código aquí 👈 class_avarage = 0 lista_resumen = [] for estudiante in students: notas = estudiante.get('grades', []) if isinstance(notas, list) and notas: avarage = sum(notas) / len(notas) lista_resumen.append({ "name": estudiante["name"], "average": round(avarage, 2) # redondeo opcional }) # 2) Calculamos el promedio de la clase a partir de los promedios individuales # Sumamos todos los average y dividimos por el número de alumnos sum_promedios = sum(al["average"] for al in lista_resumen) class_average = round(sum_promedios / len(lista_resumen), 2) # 3) Preparamos el resultado final resultado = { "class_average": class_average, "students": lista_resumen } print(resultado) get_student_average([ { "name": "Pedro", "grades": [90, 87, 88, 90], }, { "name": "Jose", "grades": [99, 71, 88, 96], }, { "name": "Maria", "grades": [92, 81, 80, 96], },])
def get_student_average(students): # Tu código aquí 👈 class_avarage = 0 lista_resumen = [] for estudiante in students: notas = estudiante.get('grades', []) if isinstance(notas, list) and notas: avarage = sum(notas) / len(notas) lista_resumen.append({ "name": estudiante["name"], "average": round(avarage, 2) # redondeo opcional }) # 2) Calculamos el promedio de la clase a partir de los promedios individuales # Sumamos todos los average y dividimos por el número de alumnos sum_promedios = sum(al["average"] for al in lista_resumen) class_average = round(sum_promedios / len(lista_resumen), 2) # 3) Preparamos el resultado final resultado = { "class_average": class_average, "students": lista_resumen } print(resultado) get_student_average([ { "name": "Pedro", "grades": [90, 87, 88, 90], }, { "name": "Jose", "grades": [99, 71, 88, 96], }, { "name": "Maria", "grades": [92, 81, 80, 96], }, ])
¿Estimados porque no funciona el comando return en la consola?
Si quiero ver los resultados de los ejercicios tengo que utilizar print. Creo que tenía ls respuesta de este reto hace rato pero como no salía en la consola, asumía que algo estaba mal con el código.
Sí funciona, solo que no se ve en pantalla. Para verlo en pantalla y asegurar que la respuesta está bien, hay que imprimirlo. Para pasar el test, hay que quitar el print para que no interfiera con la prueba, que espera que le devuelvan el resultado (sin imprimirlo). Saludos.
Podría alguien ayudarme no he podido pasar de acá:
Siempre me sale el error "list indices must be integers or slices, not str"
def get_student_average(students): students_data = {"students": [], "average": []} for student in students: name = student["name"] average = round(sum(student["grades"]) / len(student["grades"]), 2) students["student"].append(name) students["average"].append(average) class_average = round(sum(students["average"])/len(students["average"]),2) return class_average, students_data
estás agregando datos directamente a una lista cuyo elemento es un diccionario.
Hola JAime, estás actualizando el mismo diccionario que envías como parametro en la funcion y no el dictioario que creaste dentro de la función.
El valor de la llave "students" en tu nuevo diccionario declararo con valor: 0, no lo declares como lista, la llave "average" si se declara como una lista.
entonces cuando vallas actualizar students_data["student"], hazlo con el operator de asiganció "=" y no con el método append(). Para students_data["average"] si está bien le método append()
Te falta calcular el average general que vienen siendo la suma de todos los average de los estudiantes entre el numero de averages total. Puedes usar el metodo len()
Y lo que se debería retornar es solamente el dictionario nuevo.
Hola a todos! Comparto mi solución:
import statistics def get_student_average(students): student_grades = [] for student in students: student_grades.append(statistics.mean(student["grades"])) class_average = round(statistics.mean(student_grades),2) final_dict = {"class_average": class_average} grades_indv = [] for i in students: student_name = i["name"] student_average_grade = round(statistics.mean(i["grades"]),2) each = {"name": student_name, "average": student_average_grade} grades_indv.append(each) dict_grades_indv = {"students": grades_indv} final_dict.update(dict_grades_indv) return final_dict ```import statistics def get\_student\_average(students): student\_grades = \[] for student in students: student\_grades.append(statistics.mean(student\["grades"])) class\_average = round(statistics.mean(student\_grades),2) final\_dict = {"class\_average": class\_average} grades\_indv = \[] for i in students: student\_name = i\["name"] student\_average\_grade = round(statistics.mean(i\["grades"]),2) each = {"name": student\_name, "average": student\_average\_grade} grades\_indv.append(each) dict\_grades\_indv = {"students": grades\_indv} final\_dict.update(dict\_grades\_indv) return final\_dict pdta: Hice un poco de trampa al usar statistics jajaj
Mi solución
def get_student_average(students): # Tu código aquí 👈 average = {"class_average": 0, "students": []} for student in students: student_average = round(sum(student['grades']) / len(student['grades']),2) average['class_average'] += student_average average['students'].append({ "name": student['name'], "average": student_average }) average['class_average'] = round(average['class_average'] / len(average['students']), 2) return average
Les dejo mi solución, no se porque no la valen:
Aqui esta el codigo:
def get_student_average(students): students_1 = {} # Diccionario de salida list_student = [] # Prmedio individual y nombre class_average = 0 # Promedio total total_alumnos = 0 for alumno in students: alumno_average = (sum(alumno["grades"]) / len(alumno["grades"])) list_student.append({"name":alumno["name"], "average":alumno_average}) total_alumnos += 1 class_average += alumno_average class_average = class_average / total_alumnos class_average = round(class_average, 2) students_1["class_average"] = class_average students_1["students"] = list_student print(students_1) get_student_average([ { "name": "Pedro", "grades": [90, 87, 88, 90], }, { "name": "Jose", "grades": [99, 71, 88, 96], }, { "name": "Maria", "grades": [92, 81, 80, 96], },])
Mi cara cuando consigo una solución perfectamente válida, limpia y sencilla pero el corrector automático me marca todo mal:
Imagen
Voy exactamente igual con todos los retos, pero no importa. En algunos casos mi código es más robusto o más intuitivo que el de la solución del playground.
Hola, comparto mi solucion tengo conocimientos en java, c++, javascript y type script. pero realmente me he dado cuenta que python ofrece una facilidad impresionante a la hora de manejar estructuras de datos. por algo es el lenguaje preferido en la IA.
def get_student_average(students): promedio_estudiante = [] promedio_total = 0 resultados = {} for student in students: student['average'] = round(sum(student['grades']) / len(student['grades']), 2) del student['grades'] for student in students: promedio_estudiante.append(student['average']) promedio_total = round(sum(promedio_estudiante) / len(promedio_estudiante), 2) resultados = { 'class_average': promedio_total, 'students': students } return resultados ```def get\_student\_average(students): promedio\_estudiante = \[] promedio\_total = 0 resultados = {} for student in students: student\['average'] = round(sum(student\['grades']) / len(student\['grades']), 2) del student\['grades'] for student in students: promedio\_estudiante.append(student\['average']) promedio\_total = round(sum(promedio\_estudiante) / len(promedio\_estudiante), 2) resultados = { 'class\_average': promedio\_total, 'students': students } return resultados
Es importante no declarar variables innecesarias dado que ocuparan memoria.
Me descepciona mucho que el playground a veces no corra mis soluciones pero en pycharm andan perfecto:
en fin aqui esta mi solucion:
def get_student_average(students): average_student = [{students[i]['name']:round(sum(students[i]['grades'])/len(students[i]['grades']),2)} for i in range(len(students))] class_average = round(sum([average for dic in average_student for nombre, average in dic.items()])/(len([average for dic in average_student for nombre, average in dic.items()])),2) return {'class_average':class_average,'students':students} print(get_student_average(students))
def get_student_average(students): list_student = [] list_name = [] student = {} salida = [] final_promedio = 0 sub_promedio =0 for data in students: sub_promedio = sum(data['grades'])/len(data['grades']) final_promedio +=sub_promedio list_name.append({'name':data['name'],'average':sub_promedio}) list_student.append({'class_average':round(final_promedio/len(students), 2)}) list_student.append({'students': list_name}) return list_student print(get_student_average([ { "name": "Pedro", "grades": [90, 87, 88, 90], }, { "name": "Jose", "grades": [99, 71, 88, 96], }, { "name": "Maria", "grades": [92, 81, 80, 96], }, ]))
\n NON Spoiler Shield \n\n\n\n\n\n\n\n .....
def get_student_average(students): # Tu código aquí 👈 graded_class = [ ] rslt = {} avg_stdt = 0 stdt_list = [] for student in students : avg_stdt = ( sum(student["grades"] ) / len( student["grades" ] ) ) graded_class.append(avg_stdt ) stdt_list.append({ "name" : student["name"], "average" : round( avg_stdt, 2 ) }) rslt = { "class_average" : round( sum ( graded_class ) / len( graded_class ) , 2 ), "students" : stdt_list } return rslt ```def get\_student\_average(students): # Tu código aquí 👈   graded\_class = \[ ] rslt = {} avg\_stdt = 0 stdt\_list = \[]   for student in students :   avg\_stdt = ( sum(student\["grades"] ) / len( student\["grades" ] ) ) graded\_class.append(avg\_stdt ) stdt\_list.append({ "name" : student\["name"], "average" : round( avg\_stdt, 2 ) })   rslt = { "class\_average" : round( sum ( graded\_class ) / len( graded\_class ) , 2 ), "students" : stdt\_list }   return rslt