如何计算列表项的出现次数?

2160 投票
30 回答
2939575 浏览
提问于 2025-04-15 21:22

如果我有一个单独的项目,怎么在Python中计算它在列表中出现的次数呢?


还有一个相关但不同的问题是,如何计算集合中每个不同元素的出现次数,这样得到的结果是一个字典或列表,而不是一个单一的整数。关于这个问题,可以参考使用字典来计算列表中的项目

30 个回答

368

计算列表中某个项目出现的次数

如果你只想计算列表中某个特定项目出现的次数,可以使用 count() 方法。

>>> l = ["a","b","b"]
>>> l.count("a")
1
>>> l.count("b")
2

而计算列表中 所有 项目出现的次数,通常叫做“统计”列表,或者说是创建一个统计计数器。

使用 count() 统计所有项目

要统计列表 l 中项目的出现次数,可以简单地使用列表推导和 count() 方法。

[[x,l.count(x)] for x in set(l)]

(或者也可以用字典来实现,像这样 dict((x,l.count(x)) for x in set(l))

举个例子:

>>> l = ["a","b","b"]
>>> [[x,l.count(x)] for x in set(l)]
[['a', 1], ['b', 2]]
>>> dict((x,l.count(x)) for x in set(l))
{'a': 1, 'b': 2}

使用 Counter() 统计所有项目

另外,还有一个更快的方式,就是使用 collections 库里的 Counter 类。

Counter(l)

举个例子:

>>> l = ["a","b","b"]
>>> from collections import Counter
>>> Counter(l)
Counter({'b': 2, 'a': 1})

Counter 有多快?

我测试了一下 Counter 在统计列表时的速度。我用几个不同的 n 值试了这两种方法,发现 Counter 的速度大约快了两倍。

这是我用的脚本:

from __future__ import print_function
import timeit

t1=timeit.Timer('Counter(l)', \
                'import random;import string;from collections import Counter;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]'
                )

t2=timeit.Timer('[[x,l.count(x)] for x in set(l)]',
                'import random;import string;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]'
                )

print("Counter(): ", t1.repeat(repeat=3,number=10000))
print("count():   ", t2.repeat(repeat=3,number=10000)

输出结果是:

Counter():  [0.46062711701961234, 0.4022796869976446, 0.3974247490405105]
count():    [7.779430688009597, 7.962715800967999, 8.420845870045014]
2401

如果你在用Python 2.7或者3.x版本,并且想要知道每个元素出现了多少次,可以使用Counter这个工具。

>>> from collections import Counter
>>> z = ['blue', 'red', 'blue', 'yellow', 'blue', 'red']
>>> Counter(z)
Counter({'blue': 3, 'red': 2, 'yellow': 1})
2508

如果你只想统计一个项目的数量,可以使用 count 方法:

>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3

重要提示:如果你要统计多个不同的项目,这样做会非常慢

每次调用 count 方法时,它都会遍历整个包含 n 个元素的列表。如果在一个循环中调用 count n 次,那就意味着总共要检查 n * n 次,这样会严重影响性能。

如果你想统计多个项目,建议使用 Counter,这样只需要进行 n 次检查。

撰写回答