Python使用csv库计算成绩平均值时结果不准确问题求助
成绩平均值计算错误的问题修复
你的代码中平均值不准确的核心原因是:grades列表在循环外部初始化,每次处理新学生时未清空,导致之前学生的成绩被累积,最终计算的是所有已处理学生成绩的总平均值,而非当前学生自己的成绩平均值。
修正方案
将成绩列表的初始化放到遍历学生的循环内部,或者直接用列表推导式生成当前学生的成绩列表,避免成绩累积。
修正后的代码(重置成绩列表)
from collections import OrderedDict import csv from statistics import mean def calculate_averages(input_file_name, output_file_name): average = OrderedDict() with open(input_file_name, newline='') as csvfile: reader = csv.reader(csvfile) try: for lines in reader: name = lines[0] grades = [] # 每次处理新学生时重置成绩列表 for row in lines[1:]: grades.append(int(row)) grades_mean = mean(grades) average[name] = grades_mean except csv.Error as e: exit(f"file name {input_file_name}, line {reader.line_num} : {e}") # 将输出文件操作移出try块,避免嵌套过深 with open(output_file_name, 'w', newline='') as output: writer = csv.writer(output) for key, values in average.items(): writer.writerow([key, values])
更简洁的写法(列表推导式)
from collections import OrderedDict import csv from statistics import mean def calculate_averages(input_file_name, output_file_name): average = OrderedDict() with open(input_file_name, newline='') as csvfile: reader = csv.reader(csvfile) try: for lines in reader: name = lines[0] # 直接生成当前学生的成绩整数列表,无需额外维护grades变量 grades = [int(row) for row in lines[1:]] grades_mean = mean(grades) average[name] = grades_mean except csv.Error as e: exit(f"file name {input_file_name}, line {reader.line_num} : {e}") with open(output_file_name, 'w', newline='') as output: writer = csv.writer(output) for key, values in average.items(): writer.writerow([key, values])
内容的提问来源于stack exchange,提问作者user23561367
相关产品推荐
相关产品推荐

