python - How can I count the occurrences of a list item?

ID : 499

viewed : 487

Tags : pythonlistcountpython





Top 5 Answer for python - How can I count the occurrences of a list item?

vote vote

100

If you only want one item's count, use the count method:

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

Important Note regarding count performance

Don't 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.

vote vote

84

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}) 
vote vote

70

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, there's 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] 
vote vote

70

Another way to get the number of occurrences of each item, in a dictionary:

dict((i, a.count(i)) for i in a) 
vote vote

59

Given an item, how can I count its occurrences in a list in Python?

Here's an example list:

>>> l = list('aaaaabbbbcccdde') >>> l ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'e'] 

list.count

There's the list.count method

>>> l.count('b') 4 

This works fine for any list. Tuples have this method as well:

>>> t = tuple('aabbbffffff') >>> t ('a', 'a', 'b', 'b', 'b', 'f', 'f', 'f', 'f', 'f', 'f') >>> t.count('f') 6 

collections.Counter

And then there's collections.Counter. You can dump any iterable into a Counter, not just a list, and the Counter will retain a data structure of the counts of the elements.

Usage:

>>> from collections import Counter >>> c = Counter(l) >>> c['b'] 4 

Counters are based on Python dictionaries, their keys are the elements, so the keys need to be hashable. They are basically like sets that allow redundant elements into them.

Further usage of collections.Counter

You can add or subtract with iterables from your counter:

>>> c.update(list('bbb')) >>> c['b'] 7 >>> c.subtract(list('bbb')) >>> c['b'] 4 

And you can do multi-set operations with the counter as well:

>>> c2 = Counter(list('aabbxyz')) >>> c - c2                   # set difference Counter({'a': 3, 'c': 3, 'b': 2, 'd': 2, 'e': 1}) >>> c + c2                   # addition of all elements Counter({'a': 7, 'b': 6, 'c': 3, 'd': 2, 'e': 1, 'y': 1, 'x': 1, 'z': 1}) >>> c | c2                   # set union Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1, 'y': 1, 'x': 1, 'z': 1}) >>> c & c2                   # set intersection Counter({'a': 2, 'b': 2}) 

Why not pandas?

Another answer suggests:

Why not use pandas?

Pandas is a common library, but it's not in the standard library. Adding it as a requirement is non-trivial.

There are builtin solutions for this use-case in the list object itself as well as in the standard library.

If your project does not already require pandas, it would be foolish to make it a requirement just for this functionality.

Top 3 video Explaining python - How can I count the occurrences of a list item?







Related QUESTION?