如何计算列表项的出现次数?
如果我有一个单独的项目,怎么在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
次检查。