You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:57:09