Counter可直接统计字符串字符频次,无需转list或手写循环;支持most_common()取高频项、update()合并计数、clear()清零;需预处理大小写、空白符等,并明确“字符”定义。

直接用 Counter 构造函数就能统计,不用先转 list 或写循环
传字符串进去,Counter 会自动按字符拆分并计数,比手写 dict 循环快且不易错。它本质是 dict 的子类,支持所有字典操作,还能直接用 most_common() 取高频项。
- 正确写法:
from collections import Counter; c = Counter("abac")→Counter({'a': 2, 'b': 1, 'c': 1}) - 别写成
Counter(list("abac"))—— 多此一举,Counter内部已处理可迭代对象 - 空字符串、None 会报
TypeError,需提前校验:if isinstance(s, str): Counter(s)
Counter 对大小写和空白符敏感,预处理前要想清楚需求
默认情况下,'A' 和 'a' 被视为不同字符,制表符 '\t'、换行符 '\n' 也会计入。如果目标是“忽略大小写统计英文字符”,得自己清洗:
- 统一转小写:
Counter(text.lower()) - 只保留字母:
Counter(c for c in text.lower() if c.isalpha()) - 去掉空格但保留标点:
Counter(text.replace(' ', '')) - 注意:正则
re.sub(r'[^a-zA-Z]', '', text)比isalpha()更准(后者对中文返回False)
用 update() 合并多个字符串或已有计数,避免重复构造
当需要累加多个文本的统计结果时,反复调用 Counter() 创建新对象效率低,且无法复用已有结果。直接调用实例方法 update() 更合适:
-
c = Counter(); c.update("hello"); c.update("world")→Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, 'w': 1, 'r': 1, 'd': 1}) -
update()接受字符串、列表、另一个Counter实例,甚至dict - 误用
+操作符会新建对象:c1 + c2效率不如c1.update(c2)(尤其数据量大时) - 若需清零重计,用
c.clear(),别重新赋值c = Counter()(可能影响引用)
高频字符提取别只依赖 most_common(n),注意返回格式和边界情况
most_common(n) 返回的是 list[tuple[str, int]],不是 dict,取值要解包;且当 n 大于实际种类数时不会报错,而是返回全部 —— 这点容易在动态场景下漏判。
立即学习“Python免费学习笔记(深入)”;
- 安全取 top-3:
for char, count in Counter(text).most_common(3): print(char, count) - 想取最多出现的单个字符?
Counter(text).most_common(1)[0][0]—— 别忘了索引嵌套 - 如果所有字符频次相同(如 "abc"),
most_common()返回顺序不保证稳定(取决于插入顺序,Python 3.7+ 字典有序,但Counter不保证) - 需要稳定排序(如按字母序再按频次)?得手动
sorted(c.items(), key=lambda x: (-x[1], x[0]))
Counter,而是搞清你要统计的“字符”到底指什么:是 Unicode 码点?是视觉上的字形?还是业务定义的“有效字符”?预处理逻辑往往比计数本身更关键。


















