Python 中如何统计列表中元素出现的次数?
Python 统计列表元素次数:list.count() 数单个元素;collections.Counter 一次性统计所有元素并支持 most_common() 取 TOP N。本文介绍两种方法。
数单个元素用 list.count(x);统计所有元素的频次用 collections.Counter,还支持 most_common(n) 直接拿出现最多的前 N 个。
count():数单个元素
my_list = ['a', 'b', 'a', 'c', 'a']
print(my_list.count('a')) # 3
Counter:统计所有元素
from collections import Counter
my_list = ['a', 'b', 'a', 'c', 'a']
counter = Counter(my_list)
print(counter) # Counter({'a': 3, 'b': 1, 'c': 1})
print(counter['a']) # 3
print(counter.most_common(2)) # [('a', 3), ('b', 1)]——TOP 2
Counter 本质是 dict 子类,查询不存在的键返回 0 而不报错。
典型应用
# 日志中统计状态码分布
codes = [200, 200, 404, 500, 200, 404]
Counter(codes) # Counter({200: 3, 404: 2, 500: 1})
# 找出出现超过 1 次的元素
[x for x, n in Counter(my_list).items() if n > 1]
性能注意
list.count() 每次调用是 O(n) 遍历;如果要统计多个元素,用一次 Counter(O(n) 建表,之后每次查询 O(1)),比对每个元素都 count 一遍(O(n²))快得多。
常见问题(FAQ)
Q:列表元素不可哈希(如列表里套列表)怎么办?
A:count() 可用(按相等性比较);Counter 不行(需要可哈希)。可先转成元组。
Q:Counter 能做加减吗?
A:能。Counter(a) + Counter(b) 合并计数,Counter(a) - Counter(b) 相减(只保留正数)。
Q:百分比怎么算?
A:n / len(my_list),配合 Counter 遍历即可。