Python嵌套列表按平均值与姓名排序结果异常如何修复
问题原因与修复方案
核心问题定位
代码的排序逻辑存在两处问题,直接导致sohrab排序位置错误:
- 排序键错误截断平均值精度:排序时使用
int(x[1])作为第一排序键,会把所有11.0~11.999区间的平均值都转换为相同的整数值11,导致平均值为11.2857的sohrab、ali,和平均值为11.375的sarvin、sheyda被归为同一优先级,此时只会按名字排序。
字符串排序规则下ali < sarvin < sheyda < sohrab,所以s开头的sohrab会排到11区间的最后,就出现了异常结果。把sohrab改成N开头的Nima时,ali < Nima < sarvin看起来结果正常只是巧合,根本问题没有解决。 - 平均值计算位置不规范:
avg1=mean(these_grade)写在遍历成绩的循环内部,虽然最后一次循环的计算结果是正确的,但属于冗余计算,逻辑不严谨。
修复方法
修改排序的lambda表达式,去掉对平均值的int强制转换,优先按真实平均值排序,相同平均值的再按名字排序即可,同时优化平均值计算的位置。
修正后的完整代码
import csv from statistics import mean def calculate_sorted_averages(input_file_name,output_file_name): with open (input_file_name) as f: reader=csv.reader(f) list1=list() for row in reader: name=row[0] these_grade=list() for grade in row[1:]: these_grade.append(float(grade)) # 平均值计算移到成绩遍历完成后,避免重复计算 avg1=mean(these_grade) list1.append([name,avg1]) # 去掉int转换,先按真实平均值排序,再按名字排序 list1.sort(key=lambda x: (x[1], x[0])) with open (output_file_name,'w',newline='') as outp: writer = csv.writer(outp) for item in list1: writer.writerow(item)
修正后的排序结果
ali,5.0 hamid,6.066666666666666 mandana,7.5 nahid,7.833333333333333 soheila,7.833333333333333 sara,9.75 ali,11.285714285714286 sohrab,11.285714285714286 sarvin,11.375 sheyda,11.375
内容的提问来源于stack exchange,提问作者Elahe M
相关产品推荐
相关产品推荐

