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/ -- http://mail.python.org/mailman/listinfo/python-list