Python 怎么统计列表里每个元素出现的次数?附 3 种方法讲清楚

编程狮(w3cschool.cn) 2026-08-07 16:06:30 浏览数 (59)
反馈

想统计一个 Python 列表里每个元素各自出现了几次,最省事的做法是直接用 collections 模块里的 Counter,一行就能拿到每个元素的次数。你从接口或文件里拿到一个列表,里面有很多重复的值,想知道每个值到底出现了几次——比如投票结果里每个人被投了几票、一组订单里每种状态有多少个;想要逻辑更透明,也可以用普通的字典自己累加。

本文基于 Python 3.12 验证,分别演示用 Counter、手写字典、defaultdict 三种统计列表元素次数的做法,并给出横向对比和几个容易踩的坑。看完你不仅能拿到次数,还能明白哪种写法更适合你的场景。今天这篇文章,编程狮就把这块讲透。

一、先弄明白「统计列表元素次数」到底在算什么

统计列表元素次数,简单说就是数一数列表里每一个不同的值各自出现了多少次。比如列表 ['a', 'b', 'a', 'a', 'c'],统计结果应该是 a 出现 3 次、b 出现 1 次、c 出现 1 次。

它和「去重」不是一回事。去重只关心「有哪些不同的值」,而统计次数还关心「每个值出现了几遍」。如果你还不熟悉列表这种数据类型,可以先过一遍 Python3 教程 里的基础章节,把列表、字典的关系理顺。

一个贴近生活的比喻:统计次数就像盘点冰箱。你打开冰箱,把每样东西的数量记下来——鸡蛋 6 个、牛奶 2 盒、苹果 3 个。列表就是冰箱里那一堆东西,统计次数就是这张盘点表。

💡 小提示:统计次数的结果本质是一个「值 → 出现次数」的映射,在 Python 里正好用字典来装,所以下面三种方法其实都是在构造这张字典,只是写法不同。

二、方法一:collections.Counter(最推荐,一行搞定)

Counter 是 Python 标准库 collections 模块里专门用来计数的工具。你只要把列表丢给它,它就返回一个类似字典的对象,键是元素、值是次数。

from collections import Counter


fruits = ['apple', 'banana', 'apple', 'apple', 'orange', 'banana']
count = Counter(fruits)


print(count)                 # Counter({'apple': 3, 'banana': 2, 'orange': 1})
print(count['apple'])        # 3
print(count.most_common(2))  # [('apple', 3), ('banana', 2)]

上面这段做的是:先把 Counter 从 collections 里导入,再把列表交给它。Counter 内部已经帮你数好了,直接用中括号加元素名就能取次数。most_common(2) 还能直接给出出现次数最多的前两名,做排行榜时特别顺手。

常用方法记不住的话,Python 速查手册 可以常备在旁边翻。Counter 几乎覆盖了日常九成的统计列表元素次数的需求,是首选方案。

三、方法二与方法三:手写字典与 defaultdict 计数

如果你想清楚看到「计数是怎么一步步发生的」,或者运行环境比较老、不方便用 collections,那就用最朴素的字典来写。思路是:遍历列表,遇到一个新值就在字典里建一个键并设为 1,遇到已存在的就把对应值加 1。

fruits = ['apple', 'banana', 'apple', 'apple', 'orange', 'banana']
count = {}


for item in fruits:
    if item in count:
        count[item] += 1
    else:
        count[item] = 1


print(count)   # {'apple': 3, 'banana': 2, 'orange': 1}

上面这段做的是:先建一个空字典,然后一个一个看列表里的元素。if 判断这个元素是不是已经在字典里——在就加 1,不在就先记成 1。跑完循环,字典里就是每个元素的次数。

这种写法没有魔法,每一行都在做你看得懂的动作,调试时最容易定位问题。缺点是要多写几行,而且初学者容易漏掉「不存在就初始化为 1」这一步,导致程序报错。

3.1 用 defaultdict 边遍历边累加

defaultdict 也是一种字典,区别在于你访问一个不存在的键时,它会自动用你指定的类型给一个默认值,省去「先判断在不在」的麻烦。配上 int,访问不存在的键会自动得到 0,于是直接加 1 就行。

from collections import defaultdict


fruits = ['apple', 'banana', 'apple', 'apple', 'orange', 'banana']
count = defaultdict(int)


for item in fruits:
    count[item] += 1


print(dict(count))   # {'apple': 3, 'banana': 2, 'orange': 1}

上面这段做的是:创建一个默认值是 0 的字典,遍历列表时不管键存不存在都直接加 1——不存在时它先补 0 再加,不会报错。最后用 dict() 转回普通字典只是为了方便打印。

比起方法二,它少了一次 if 判断,代码更干净;比起方法一,它更灵活,比如你能顺便在累加时做别的运算。关于这些数据类型的区别,编程词典 里有更系统的对照。

四、三种方法怎么选,以及几个常见坑

把三种写法摆在一起看,各自的适用场景就很清楚了:

方法 适用场景 优点 代价
Counter 绝大多数日常统计 一行搞定,自带 most_common 排序 需要了解 collections
普通字典 教学、调试、老环境 逻辑透明,零依赖 多写几行,易漏初始化
defaultdict 边遍历边做额外处理 代码干净,不用判断存在 需了解 defaultdict 行为

核心建议:能写 Counter 就写 Counter,它是统计列表元素次数的标准答案;只有在需要把「计数」和其他逻辑揉在一起时,才考虑 defaultdict;纯教学或受限环境才用手写字典。

4.1 几个常见的坑

第一,Counter 统计的对象不限于字符串。列表里是数字、元组甚至别的列表都能统计,只要元素本身能作为字典的键(不可变类型)就行。

第二,空列表不会报错。Counter 对空列表返回空结果,手写字典和 defaultdict 也会得到空字典,放心用。

第三,列表里混了不可变和可变类型要小心。例如同时放字符串和数字没问题,但放一个列表进去会报错,因为列表不能作为字典键。

⚠️ 注意:如果你统计的是很大的列表(几十万以上),三种方法速度差别很小,优先选可读性最好的 Counter,不要为了微乎其微的性能去牺牲代码清晰度。

总结

统计列表元素次数,本质就是构造一张「值 → 次数」的字典。最省事的做法是用 collections 里的 Counter,一行拿到结果;想看清楚过程就用手写字典;需要在遍历时顺手做其他事就用 defaultdict。

要点带走:

  • Counter 是统计列表元素次数的首选,还自带 most_common 排序;
  • 手写字典逻辑最透明,但记得给新键初始化为 1;
  • defaultdict(int) 能省掉存在性判断,写法更干净。

下一步,把字典、集合这些「值到值」的结构一起学扎实,处理数据会更顺手。

延伸学习

想把 Python 数据处理这块系统补齐,可以按这个顺序来:

  1. 想系统学 Python,Python 开发方向 整理了从基础到进阶的学习路径;
  2. 想边学边练,编程课程 里有配套实战可以上手。

常见问题

Q:Counter 能统计字符串里每个字符出现的次数吗?
A:能。把字符串直接传给 Counter 就行,它会按每个字符拆开计数,比如 Counter('banana') 得到 b:1、a:3、n:2。

Q:统计完想按次数从多到少排序怎么办?
A:用 Counter 的 most_common() 方法,不传参数返回全部、按次数降序排列;传数字 n 就只返回前 n 名,做Top榜很方便。

Q:列表里有重复的数字,统计次数会出错吗?
A:不会。数字和字符串一样都能作为字典的键,Counter 对数字列表的统计完全正常,例如 Counter([1, 1, 2]) 得到 1:2、2:1。

0 人点赞