偶数长度列表中位数计算错误及数值取整优化的技术问询
问题解决与优化方案
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
相关产品推荐
相关产品推荐

