在Python的数据处理场景中,找出一组数据里最常出现的值也就是众数,是很多业务需求里的基础操作,比如统计用户最常访问的页面、商品销量最高的品类等。我们可以通过内置模块提供的工具快速实现这个需求,也有更灵活的自定义统计方案。

使用statistics模块的mode函数计算众数
Python标准库的statistics模块提供了专门的mode函数,可以直接返回可迭代对象中最常出现的值,使用起来非常简单。不过这个函数有一个限制,如果数据中有多个值出现的频次相同且都是最高,它会直接抛出StatisticsError异常。
首先看基础的使用示例,统计列表中出现的众数:
from statistics import mode, StatisticsError
# 定义测试数据,3出现了3次,是最常出现的值
data_list = [1, 2, 3, 3, 3, 4, 5, 5]
try:
result = mode(data_list)
print(f"列表的众数为:{result}")
except StatisticsError as e:
print(f"计算众数失败:{e}")
如果数据中存在多个众数,比如下面的例子里2和3都出现了2次,是最高的频次:
from statistics import mode, StatisticsError
multi_mode_data = [1, 2, 2, 3, 3, 4]
try:
result = mode(multi_mode_data)
print(f"列表的众数为:{result}")
except StatisticsError as e:
# 这里会捕获到异常,提示存在多个众数
print(f"计算众数失败:{e}")
使用collections的Counter实现频次统计
如果需要更灵活的频次统计,比如获取所有出现的值的频次,或者处理多个众数的场景,可以使用collections模块里的Counter类。Counter可以统计可迭代对象中每个元素的出现次数,返回一个类似字典的计数器对象。
基础频次统计
先实现统计所有元素的出现频次,并且找出最高的频次对应的值:
from collections import Counter
data = [1, 2, 3, 3, 3, 4, 5, 5, 5]
# 创建Counter对象,统计每个元素的出现次数
counter_obj = Counter(data)
print(f"所有元素的频次统计:{counter_obj}")
# 找出出现次数最多的值,most_common返回的是列表,元素是(值, 频次)的元组
# 参数1表示只返回频次最高的1个
top_1 = counter_obj.most_common(1)
print(f"出现次数最多的值和频次:{top_1}")
print(f"最常出现的值为:{top_1[0][0]},出现了{top_1[0][1]}次")
处理多个众数的场景
当数据存在多个众数时,我们可以通过Counter的统计结果筛选出所有频次等于最高频次的值:
from collections import Counter
multi_mode_data = [1, 2, 2, 3, 3, 4]
counter_obj = Counter(multi_mode_data)
# 获取最高的频次
max_count = max(counter_obj.values())
# 筛选出所有频次等于最高频次的值
all_modes = [item for item, count in counter_obj.items() if count == max_count]
print(f"所有众数为:{all_modes}")
print(f"最高频次为:{max_count}")
两种方法的适用场景对比
我们可以通过下面的表格对比两种方法的差异,方便选择适合自己场景的方案:
| 方案 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| statistics.mode | 代码简洁,一行即可实现 | 多个众数时会抛异常,无法获取全部频次信息 | 确定数据只有一个众数,只需要快速获取结果的场景 |
| collections.Counter | 可获取全部频次,支持多个众数,灵活度高 | 代码相对多几行,需要额外处理筛选逻辑 | 需要统计全部频次、可能存在多个众数、需要自定义统计规则的场景 |
注意事项
- statistics.mode函数要求传入的可迭代对象不能为空,否则会抛出StatisticsError异常,使用前最好先判断数据是否为空。
- Counter的most_common方法如果不传参数,会返回所有元素的频次排序结果,数据量大的时候要注意性能问题。
- 如果统计的是字符串、元组等可哈希类型的数据,Counter都可以正常统计,但是列表、字典等不可哈希类型不能作为Counter的统计元素。
除了上述两种标准库的方法,我们也可以通过自定义字典手动实现频次统计,逻辑和Counter的实现类似,但是Counter是底层优化过的实现,性能会更好,优先推荐使用标准库的方案。
Pythonmode众数频次统计collections修改时间:2026-07-02 21:03:33