tallying occurrences in list

MRAB python at mrabarnett.plus.com
Fri Jun 4 14:50:16 EDT 2010


kj wrote:
> 
> 
> 
> 
> Task: given a list, produce a tally of all the distinct items in
> the list (for some suitable notion of "distinct").
> 
> Example: if the list is ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b',
> 'c', 'a'], then the desired tally would look something like this:
> 
> [('a', 4), ('b', 3), ('c', 3)]
> 
> I find myself needing this simple operation so often that I wonder:
> 
> 1. is there a standard name for it?
> 2. is there already a function to do it somewhere in the Python
>    standard library?
> 
> Granted, as long as the list consists only of items that can be
> used as dictionary keys (and Python's equality test for hashkeys
> agrees with the desired notion of "distinctness" for the tallying),
> then the following does the job passably well:
> 
> def tally(c):
>     t = dict()
>     for x in c:
>         t[x] = t.get(x, 0) + 1
>     return sorted(t.items(), key=lambda x: (-x[1], x[0]))
> 
> But, of course, if a standard library solution exists it would be
> preferable.  Otherwise I either cut-and-paste the above every time
> I need it, or I create a module just for it.  (I don't like either
> of these, though I suppose that the latter is much better than the
> former.)
> 
> So anyway, I thought I'd ask. :)
> 
In Python 3 there's the 'Counter' class in the 'collections' module.
It'll also be in Python 2.7.

For earlier versions there's this:

     http://code.activestate.com/recipes/576611/



More information about the Python-list mailing list