奇偶长度列表中位数计算异常:偶数列表结果不符合预期排查
如何修正中位数计算函数的偶数长度列表问题?
嘿,我帮你找出问题所在啦!你的代码里有几个关键错误,导致偶数长度列表的中位数计算不对,咱们一步步拆解:
问题分析
- 全局变量误用:你的函数参数是
myEvenList,但函数内部却在操作全局的myOddList,甚至用myOddList的长度n来判断奇偶分支!这就意味着不管你传入什么列表,函数都只会根据全局的奇数长度列表来走分支,自然不会触发偶数列表的计算逻辑,返回3也就不奇怪了。 - 不必要的全局变量修改:函数里同时对全局的
myOddList和参数myEvenList执行sort(),这不仅完全没必要,还会意外修改全局变量的顺序。
修正后的代码
myOddList = [1, 2, 3, 4, 5] myEvenList = [1, 2, 3, 4, 5, 6] def medianCalculator(lst): # 复制列表后排序,避免修改原始输入列表(若无需保留原列表,可直接用lst.sort()) sorted_list = lst.copy() sorted_list.sort() length = len(sorted_list) if length % 2 != 0: # 奇数长度:直接取中间索引的元素 return sorted_list[length // 2] else: # 偶数长度:取中间两个元素的平均值 mid_left = sorted_list[(length // 2) - 1] mid_right = sorted_list[length // 2] return (mid_left + mid_right) / 2 # 测试奇数列表 print(medianCalculator(myOddList)) # 输出 3 # 测试偶数列表 print(medianCalculator(myEvenList)) # 输出 3.5
关键修正点
- 通用参数设计:把函数参数改成通用的
lst,不管传入奇数还是偶数长度的列表,都能统一处理。 - 基于传入列表判断奇偶:用传入列表的
length来决定走哪个分支,这才是符合逻辑的判断依据。 - 安全排序:先复制列表再排序,避免意外修改原始输入的列表顺序(如果你的场景允许修改原列表,也可以省略复制步骤直接排序)。
- 简化偶数索引计算:对于长度为6的列表,
length//2得到3,前一个索引是2,对应元素3,后一个索引3对应元素4,两者的平均值正好是3.5,逻辑更直观。
内容的提问来源于stack exchange,提问作者user13938341
相关产品推荐
相关产品推荐

