如何正确将平均值从低到高排序?Python代码修复求助
修复CSV文件最低三个平均值计算与排序问题
原代码问题分析
你的代码存在三个核心问题导致输出异常:
- 错误的排序逻辑:将平均值转成字符串后,用
key=lambda x: x[1]排序,这是按字符串的第二个字符(比如"7.5"的第二个字符是".")排序,完全不符合数值排序需求。 - 字符串存储引发写入异常:把平均值转成字符串存入列表,后续用
csv.writer.writerows写入时,会将字符串的每个字符拆分成CSV列,因此出现7,.,5这类奇怪输出。 - 排序逻辑偏离需求:原排序规则完全错误,无法正确筛选出数值最低的三个平均值。
修复后的代码
无需彻底重写,仅修改几个关键部分即可:
import csv from statistics import mean # 确保导入mean函数,原代码可能遗漏该导入 def calculate_three_worst(input_file_name, output_file_name): #Task4 with open(input_file_name, 'r') as input_file: reader = csv.reader(input_file) data = list(reader) averages = [] for row in data: name = row[0] grades = [float(grade) for grade in row[1:]] average = mean(grades) averages.append(average) # 保留数值类型,不转换为字符串 # 按数值升序排序,直接取前三个最低值 sorted_averages = sorted(averages) bottom_three = sorted_averages[:3] with open(output_file_name, 'w') as output_file: # 逐行写入平均值,避免CSV writer拆分字符串的问题 for avg in bottom_three: output_file.write(f"{avg}\n") calculate_three_worst("C:\\Users\\Tandis\\Desktop\\hh.CSV", "C:\\Users\\Tandis\\Desktop\\tester.txt")
关键修改说明
- 保留数值类型:
averages.append(average)不再将平均值转为字符串,确保排序基于数值大小而非字符串字符。 - 修正排序逻辑:
sorted(averages)默认按数值升序排列,直接得到从小到大的平均值列表,取前三个即为最低的三个值。 - 正确写入文件:使用普通文件的
write方法逐行写入平均值,避免CSV writer拆分字符串的问题;若坚持使用CSV writer,可改为writer.writerow([avg]),将每个平均值包装为单元素列表,保证每行仅输出一个值。
验证结果
运行修改后的代码,输出文件内容将与预期完全一致:
5.0 6.066666666666666 7.5
内容的提问来源于stack exchange,提问作者Negar Seidy
相关产品推荐
相关产品推荐

