Python自定义均值/中位数/众数函数处理2500长度数组报错排查
嘿,我帮你找出代码里的问题啦,主要是众数的计算逻辑错了,还有一些小细节需要调整,一起来看看:
核心问题:众数函数逻辑错误
你的mode函数判断条件完全搞反了,导致根本找不到真正出现次数最多的元素。当前代码里的if (i <= mode) and (sorted_list.count(i) >= max_count)会忽略比当前mode大但出现次数更多的元素。举个例子:如果数组里2出现3次,5出现4次,你的代码会一直把mode保留为2——因为5>2,不满足i<=mode的条件,根本不会更新mode值,这直接导致了Wrong Answer。
另外,每次遍历都调用sorted_list.count(i),对于2500个元素的数组来说,时间复杂度是O(n²),虽然能跑,但效率很低,不如先用字典统计次数。
次要问题:依赖全局变量+输出格式
- 全局变量N的依赖:你的mean和median函数直接用了全局的N,而不是传入列表的长度
len(sample_list)。虽然Hackerrank输入是规范的,但这样的函数复用性很差,万一传入的列表长度和N不一致就会出错。 - 输出格式可能不匹配:Hackerrank对输出格式要求很严格,比如预期输出里的均值是
49921.5(小数),中位数是49253.5,众数是整数2184。你的代码直接print计算结果,可能会出现比如49253.0这样的输出,而题目可能希望输出整数49253。
修正后的代码
N = int(input()) var_list = [int(x) for x in input().split()] def mean(sample_list): # 用列表自身长度代替全局N,更健壮 avg = sum(sample_list) / len(sample_list) # 按题目要求输出格式:整数输出整数,小数保留一位 print(avg if avg % 1 != 0 else int(avg)) return avg def median(sample_list): sorted_list = sorted(sample_list) n = len(sample_list) if n % 2 != 0: med = sorted_list[n // 2] else: med = (sorted_list[n//2] + sorted_list[n//2 - 1]) / 2 # 同样处理输出格式 print(med if med % 1 != 0 else int(med)) return med def mode(sample_list): # 用字典统计每个元素的出现次数,O(n)时间复杂度 count_dict = {} for num in sample_list: count_dict[num] = count_dict.get(num, 0) + 1 # 找到最大出现次数 max_count = max(count_dict.values()) # 收集所有出现次数等于最大值的元素,取其中最小的(符合题目要求) mode_candidates = [num for num, cnt in count_dict.items() if cnt == max_count] mode_val = min(mode_candidates) print(mode_val) return mode_val mean(var_list) median(var_list) mode(var_list)
代码说明
- 众数函数优化:用字典一次遍历统计所有元素的出现次数,然后筛选出所有出现次数最多的元素,取最小值——完全符合题目中“多个众数选最小”的要求,而且效率比原来高很多。
- 移除全局变量:所有函数都使用
len(sample_list)代替全局N,函数独立性更强,不容易出错。 - 输出格式适配:判断计算结果是整数还是小数,分别输出对应的格式,和预期输出完全匹配。
测试小技巧
你可以用小数组验证每个函数的正确性:
- 测试众数:
[1,1,2,2,3]应该返回1(1和2出现次数相同,选最小);[1,2,2,3,3,3]应该返回3。 - 测试中位数:
[1,2,3,4]返回2.5;[1,2,3]返回2。
内容的提问来源于stack exchange,提问作者Kovus Seyit




