Python编写均值中位数众数计算器时min()函数返回值错误如何解决
Python均值/中位数/众数计算器mode函数修复方案
问题根因
- 核心问题来自Python不同版本
statistics.mode的行为差异:- Python 3.8及更早版本:当数组存在多个相同最高频次的众数时,会抛出
StatisticsError,此时代码会进入异常分支返回最小值,逻辑符合预期 - Python 3.10及更高版本:当数组存在多个相同最高频次的众数时,不会抛出异常,会直接返回第一个出现的最高频次元素,因此不会执行
min(new_arr)的逻辑,导致返回结果不符合预期
- Python 3.8及更早版本:当数组存在多个相同最高频次的众数时,会抛出
修复方案
不要依赖statistics.mode的异常逻辑处理多众数场景,自己实现频次统计逻辑,兼容所有Python版本,可直接替换原有mode函数:
from collections import Counter def mode(split_arr): new_arr = [int(i) for i in split_arr] # 统计每个元素的出现频次 count = Counter(new_arr) # 取最高频次值 max_freq = max(count.values()) # 筛选所有达到最高频次的元素,返回最小值 mode_candidates = [num for num, freq in count.items() if freq == max_freq] return min(mode_candidates)
可选优化(非必须)
小提示:输入处理部分可以把
arr = raw_arr.split(" ")改成arr = raw_arr.split(),可以避免输入首尾带空格、元素之间多个空格导致的转int报错问题。
如果使用Python 3.8及以上版本,也可以改用官方提供的statistics.multimode直接获取所有众数再取最小,代码更简洁:
def mode(split_arr): new_arr = [int(i) for i in split_arr] all_modes = statistics.multimode(new_arr) return min(all_modes)
内容的提问来源于stack exchange,提问作者Adit Magotra
相关产品推荐
相关产品推荐

