Can list comprehensions (ideally) do the equivalent of 'count(*)...group by...' in SQL?

count, list, python, python-2.6

Solution

Lennart Regebro provided a nice one-liner that does what you want:

>>> values = [1,1,1,2]
>>> print [(x,values.count(x)) for x in set(values)]
[(1, 3), (2, 1)]

As S.Lott mentions, a defaultdict can do the same thing.

Problem

I think list comprehensions may give me this, but I'm not sure: any elegant solutions in Python (2.6) in general for selecting unique objects in a list and providing a count? (I've defined an `__eq__` to define uniqueness on my object definition). So in RDBMS-land, something like this: ``` CREATE TABLE x(n NUMBER(1)); INSERT INTO x VALUES(1); INSERT INTO x VALUES(1); INSERT INTO x VALUES(1); INSERT INTO x VALUES(2); SELECT COUNT(*), n FROM x GROUP BY n; ``` Which gives: ``` COUNT(*) n ========== 3 1 1 2 ``` So , here's my equivalent list in Python: ``` [1,1,1,2] ``` And I want the same output as the SQL SELECT gives above. EDIT: The example I gave here was simplified, I'm actually processing lists of user-defined object-instances: just for completeness I include the extra code I needed to get the whole thing to work: ``` import hashlib def __hash__(self): md5=hashlib.md5() [md5.update(i) for i in self.my_list_of_stuff] return int(md5.hexdigest(),16) ``` The `__hash__` method was needed to get the `set` conversion to work (I opted for the list-comprehension idea that works in 2.6 [despite the fact that I learnt that involves an inefficiency (see comments) - my data set is small enough for that not be an issue]). `my_list_of_stuff` above is a list of (Strings) on my object definition.

Original source

Related problems