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

Python嵌套列表按平均值与姓名排序结果异常如何修复

问题原因与修复方案

核心问题定位

代码的排序逻辑存在两处问题,直接导致sohrab排序位置错误:

  1. 排序键错误截断平均值精度:排序时使用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看起来结果正常只是巧合,根本问题没有解决。
  2. 平均值计算位置不规范: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:54:04