python – How can I count the occurrences of a list item?
python – How can I count the occurrences of a list item?
If you only want one items count, use the count
method:
>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3
Important Note regarding count performance
Dont use this if you want to count multiple items.
Calling count
in a loop requires a separate pass over the list for every count
call, which can be catastrophic for performance.
If you want to count all items, or even just multiple items, use Counter
, as explained in the other answers.
Use Counter
if you are using Python 2.7 or 3.x and you want the number of occurrences for each element:
>>> from collections import Counter
>>> z = [blue, red, blue, yellow, blue, red]
>>> Counter(z)
Counter({blue: 3, red: 2, yellow: 1})
python – How can I count the occurrences of a list item?
Counting the occurrences of one item in a list
For counting the occurrences of just one list item you can use count()
>>> l = [a,b,b]
>>> l.count(a)
1
>>> l.count(b)
2
Counting the occurrences of all items in a list is also known as tallying a list, or creating a tally counter.
Counting all items with count()
To count the occurrences of items in l
one can simply use a list comprehension and the count()
method
[[x,l.count(x)] for x in set(l)]
(or similarly with a dictionary dict((x,l.count(x)) for x in set(l))
)
Example:
>>> 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}
Counting all items with Counter()
Alternatively, theres the faster Counter
class from the collections
library
Counter(l)
Example:
>>> l = [a,b,b]
>>> from collections import Counter
>>> Counter(l)
Counter({b: 2, a: 1})
How much faster is Counter?
I checked how much faster Counter
is for tallying lists. I tried both methods out with a few values of n
and it appears that Counter
is faster by a constant factor of approximately 2.
Here is the script I used:
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)
And the output:
Counter(): [0.46062711701961234, 0.4022796869976446, 0.3974247490405105]
count(): [7.779430688009597, 7.962715800967999, 8.420845870045014]