counter专为计数设计,比手动字典循环更快更安全,支持可迭代对象直接初始化、缺失键返回0、数学运算等特性,且内部用c实现,10万+元素时快2–3倍。

直接用 collections.Counter,它专为这事设计,比手写字典循环快且不易出错。
为什么不用 dict 循环手动计数
手动遍历列表、用 if key in dict 判断再累加,代码冗长,还容易漏掉初始化逻辑。更关键的是,Counter 内部用 C 实现了大部分逻辑,对中大型列表(比如 10 万+ 元素)性能提升明显——实测快 2–3 倍。另外,Counter 支持直接传入任意可迭代对象(字符串、元组、生成器),而普通字典做不到这点。
- 常见错误:写成
count_dict[item] += 1却没先初始化count_dict[item] = 0,触发KeyError - 正确替代:用
defaultdict(int)或直接上Counter,省去判断 - 注意:
Counter对不可哈希类型(如字典、列表)会直接报TypeError,这点和字典一致
Counter 的基础用法与常用操作
构造后得到一个类似字典的对象,但多了几个实用方法。最常被忽略的是它的“可加减”特性——两个 Counter 可以直接用 + 或 - 合并或抵消频次。
- 统计:
c = Counter([1, 2, 2, 3, 3, 3])→Counter({3: 3, 2: 2, 1: 1}) - 取高频:
c.most_common(2)→[(3, 3), (2, 2)](返回元组列表,按频次降序) - 转回普通字典:
dict(c),但没必要,它本身支持所有字典读取操作(如c[5]返回0而非 KeyError) - 清零重用:调用
c.clear(),比新建对象更省内存
处理字符串、嵌套结构与边界情况
很多人只想到统计数字或单词,但 Counter 对字符串默认按字符统计;若要按词统计,得先分词。嵌套结构(如列表套字典)不能直接传入,必须展平或提取键值。
- 字符串按字符:
Counter("abac")→Counter({'a': 2, 'b': 1, 'c': 1}) - 字符串按词:先
words = text.split(),再Counter(words);注意标点需提前清洗 - 嵌套列表:比如
data = [[1,2], [2,3], [1,2]],不能直接Counter(data)(报错),得用Counter(tuple(x) for x in data) - 空输入:
Counter([])返回空Counter(),安全;但Counter(None)会报错
真正容易被忽略的点是:当元素本身是浮点数时,精度误差可能导致本该相同的数被算作不同键;还有就是中文分词必须依赖外部库(如 jieba),Counter 不解决语义切分问题。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











