如何用Python计算全体学生总分平均分?代码结果异常求助
问题:无法正确计算全体学生总分平均分
我无法从学生列表中计算出所有学生的总分平均分。以下是我编写的Python解决方案,但运行结果不符合预期:
原代码
fname = input('Enter the file name: ') print() with open(fname, 'r') as f: print("Student Marks") count = 0 total = 0 for line in f: words = line.split() names = [] marks = [] for word in words: try: value = float(word) except ValueError: names.append(word) else: marks.append(value) name = ' '.join(names) if not marks: pass else: print(name,' ', marks) count1 = 0 total1 = 0 i = 0 while i < len(marks): count1 = count1 +1 total1 = total1 + float(marks[i]) i=i+1 t = total1/count1 print("avarage:", t, '\n') count = count+1 tm = (total+t)/count print(tm)
原运行输出
Enter the file name: sm.txt Student Marks Jean Paul Alarie [56.0] avarage: 56.0 56.0 Juan Manuel Bienvenida [72.6, 12.0] avarage: 42.3 21.15 Janet Brimfield [66.3, 71.0] avarage: 68.65 22.883333333333336 Helen Jane Burnett [54.0] avarage: 54.0 13.5 Bernard Galpin [45.0, 66.2, 32.0] avarage: 47.73333333333333 9.546666666666665 Alexander Adam Janssen [41.0, 21.0] avarage: 31.0 5.166666666666667 Struan Kilgour [79.0, 82.5, 45.5] avarage: 69.0 9.857142857142858 Pierre Antoine Lajoie [56.2, 45.5] avarage: 50.85 6.35625 Hamish McDonald [66.5, 91.0] avarage: 78.75 8.75 Shakeel Mirza [12.0] avarage: 12.0 1.2 Sidney Rickard [88.0, 78.0, 84.4] avarage: 83.46666666666667 7.587878787878788 Sharlene Urry [54.5] avarage: 54.5 4.541666666666667 Karl James Richard White [62.0, 59.5, 41.2, 66.0] avarage: 57.175 4.398076923076923 >>>
期望输出
>>> Enter a filename: Student Marks.txt Student Marks Jean Paul Alarie: Marks: 56.0, Average: 56.0 Juan Manuel Bienvenida: Marks: 72.6, 12.0, Average: 42.3 Janet Brimfield: Marks: 66.3, 71.0, Average: 68.65 Helen Jane Burnett: Marks: 54.0, Average: 54.0 Bernard Galpin: Marks: 45.0, 66.2, 32.0, Average: 47.73 … Average: 54.26 >>>
修正后的代码
fname = input('Enter the file name: ') print() with open(fname, 'r') as f: print("Student Marks") student_count = 0 total_all_averages = 0.0 for line in f: line = line.strip() if not line: continue # 跳过空行 words = line.split() names = [] marks = [] for word in words: try: value = float(word) marks.append(value) except ValueError: names.append(word) name = ' '.join(names) if not marks: continue # 计算单个学生的平均分 student_avg = sum(marks) / len(marks) # 累加全体学生的平均分总和和计数 total_all_averages += student_avg student_count += 1 # 按期望格式输出 print(f"{name}:") # 格式化marks为逗号分隔的字符串 marks_str = ", ".join(f"{m}" for m in marks) print(f"Marks: {marks_str}, Average: {student_avg:.2f}\n") # 计算并输出全体学生的总分平均分 if student_count > 0: overall_avg = total_all_averages / student_count print(f"Average: {overall_avg:.2f}")
关键修改点
- 修正全体平均分计算逻辑:原代码每次循环错误计算
tm = (total + t)/count,现在改为累加每个学生的平均分到total_all_averages,最后用总和除以学生总数得到全体平均分。 - 简化单个学生平均分计算:用
sum(marks)/len(marks)替代冗余的while循环,代码更简洁高效。 - 调整输出格式:匹配期望的打印样式,名字后加冒号,marks用逗号分隔,平均分保留两位小数。
- 跳过空行:增加对空行的判断,避免处理无效内容。
- 移除中间错误输出:删除了原代码中每次循环打印的错误全体平均分,只在所有学生处理完成后统一输出最终结果。
内容的提问来源于stack exchange,提问作者Liudmyla Horokhivska
相关产品推荐
相关产品推荐

