Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: how to get sorted count of items in a list?

Tags:

python

In Python, I've got a list of items like:

mylist = [a, a, a, a, b, b, b, d, d, d, c, c, e]

And I'd like to output something like:

a (4)
b (3)
d (3)
c (2)
e (1)

How can I output a count and leaderboard of items in a list? I'm not too bothered about efficiency, just any way that works :)

Thanks!

like image 253
AP257 Avatar asked Feb 18 '10 18:02

AP257


2 Answers

from collections import defaultdict

def leaders(xs, top=10):
    counts = defaultdict(int)
    for x in xs:
        counts[x] += 1
    return sorted(counts.items(), reverse=True, key=lambda tup: tup[1])[:top]

So this function uses a defaultdict to count the number of each entry in our list. We then take each pair of the entry and its count and sort it in descending order according to the count. We then take the top number of entries and return that.

So now we can say

>>> xs = list("jkl;fpfmklmcvuioqwerklmwqpmksdvjioh0-45mkofwk903rmiok0fmdfjsd")
>>> print leaders(xs)
[('k', 7), ('m', 7), ('f', 5), ('o', 4), ('0', 3), ('d', 3), ('i', 3), ('j', 3), ('l', 3), ('w', 3)]
like image 143
Eli Courtwright Avatar answered Oct 01 '22 08:10

Eli Courtwright


I'm surprised that no one has mentioned collections.Counter. Assuming

import collections
mylist = ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'd', 'd', 'd', 'c', 'c', 'e']

it's just a one liner:

print(collections.Counter(mylist).most_common())

which will print:

[('a', 4), ('b', 3), ('d', 3), ('c', 2), ('e', 1)]

Note that Counter is a subclass of dict with some useful methods for counting objects. Refer to the documentation for more info.

like image 32
AXO Avatar answered Oct 01 '22 08:10

AXO