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

偶数长度列表中位数计算错误及数值取整优化的技术问询

问题解决与优化方案

1. 偶数长度列表中位数错误修复

你的median函数里,l.copy().sort()仅创建了原列表的副本并排序,但这个排序后的副本没有被保存,后续操作的还是未排序的原列表,这就是计算错误的根源。

修复方法:直接使用sorted()函数生成排序后的新列表(不修改原列表),基于排序后的列表计算中位数:

def median(l):
    sorted_l = sorted(l)
    n = len(sorted_l)
    if n % 2 != 0:
        return sorted_l[n//2]
    else:
        mid = n//2 - 1
        return (sorted_l[mid] + sorted_l[mid+1]) / 2

测试原例子[7,2,4,5]:

  • 原列表排序后为[2,4,5,7],中位数计算为(4+5)/2=4.5,符合预期;
  • 平方后的列表[49,4,16,25]排序后为[4,16,25,49],中位数计算为(16+25)/2=20.5,也符合预期。

2. 数值取整方法

根据不同需求,常用的取整方式有:

  • 四舍五入到指定小数位:使用round(num, decimal_places),例如round(4.5, 1)返回4.5,round(23.5, 0)返回24;
  • 向下取整(地板取整):导入math模块后用math.floor(num),例如math.floor(4.5)返回4;
  • 向上取整(天花板取整):导入math模块后用math.ceil(num),例如math.ceil(4.1)返回5;
  • 直接截断小数部分:用int(num)(仅对正数有效),例如int(4.9)返回4;
  • 保留指定小数位(不四舍五入):通过字符串格式化实现,例如"{:.1f}".format(4.56)返回"4.5",可再转换为数值类型。

若要将统计结果保留1位小数,可修改calcStats函数:

def calcStats(l):
    minL = min(l)
    avgL = round(sum(l) / len(l), 1)
    medL = round(median(l), 1)
    maxL = max(l)
    return minL, avgL, medL, maxL

修复后的完整代码

def exercise3(l):
    l2 = [number ** 2 for number in l]    
    def median(l):
        sorted_l = sorted(l)
        n = len(sorted_l)
        if n % 2 != 0:
            return sorted_l[n//2]
        else:
            mid = n//2 - 1
            return (sorted_l[mid] + sorted_l[mid+1]) / 2
    def calcStats(l):
        minL = min(l)
        avgL = sum(l) / len(l)
        medL = median(l)
        maxL = max(l)
        return minL, avgL, medL, maxL
    
    return calcStats(l), calcStats(l2)

测试exercise3([7,2,4,5])会返回((2, 4.5, 4.5, 7), (4, 23.5, 20.5, 49)),完全符合预期。

内容的提问来源于stack exchange,提问作者RyanOliver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:55:20