Search code examples
pythonlistfrequency

How to count the frequency of the elements in an unordered list?


Given an unordered list of values like

a = [5, 1, 2, 2, 4, 3, 1, 2, 3, 1, 1, 5, 2]

How can I get the frequency of each value that appears in the list, like so?

# `a` has 4 instances of `1`, 4 of `2`, 2 of `3`, 1 of `4,` 2 of `5`
b = [4, 4, 2, 1, 2] # expected output

Solution

  • In Python 2.7 (or newer), you can use collections.Counter:

    >>> import collections
    >>> a = [5, 1, 2, 2, 4, 3, 1, 2, 3, 1, 1, 5, 2]
    >>> counter = collections.Counter(a)
    >>> counter
    Counter({1: 4, 2: 4, 5: 2, 3: 2, 4: 1})
    >>> counter.values()
    dict_values([2, 4, 4, 1, 2])
    >>> counter.keys()
    dict_keys([5, 1, 2, 4, 3])
    >>> counter.most_common(3)
    [(1, 4), (2, 4), (5, 2)]
    >>> dict(counter)
    {5: 2, 1: 4, 2: 4, 4: 1, 3: 2}
    >>> # Get the counts in order matching the original specification,
    >>> # by iterating over keys in sorted order
    >>> [counter[x] for x in sorted(counter.keys())]
    [4, 4, 2, 1, 2]
    

    If you are using Python 2.6 or older, you can download an implementation here.