tallying occurrences in list

Magdoll magdoll at gmail.com
Fri Jun 4 14:38:23 EDT 2010


On Jun 4, 11:33 am, Peter Otten <__pete... at web.de> wrote:
> 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. :)
>
> Python 3.1 has, and 2.7 will have collections.Counter:
>
> >>> from collections import Counter
> >>> c = Counter("abcabcabca")
> >>> c.most_common()
>
> [('a', 4), ('c', 3), ('b', 3)]
>
> Peter


Thanks Peter, I think you just answered my post :)



More information about the Python-list mailing list