2010-02-18 13 views
5

W Pythonie Mam listę elementów, takich jak:Python: jak uzyskać posortowaną liczbę elementów na liście?

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

I chciałbym do wyjścia coś jak:

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

Jak mogę wyjście zliczania i pozycji w tabeli liderów lista? Nie martwię się zbytnio wydajnością, po prostu w dowolny sposób :)

Dzięki!

+1

co próbowałeś? na SO jest mnóstwo duplikatów. Czy próbowałeś przynajmniej ich szukać? – SilentGhost

+0

Tak, mam. Niestety, mogę używać niewłaściwych wyszukiwanych haseł, ale nie mogłem znaleźć niczego, co wyglądałoby tak, jak potrzebowałem. Eksperymentowałem, ale nie za bardzo ... przepraszam – AP257

+2

dupe: http://stackoverflow.com/questions/2148480/can-pythons-list-comprehensions-ideally-do-the-equivalent-of-count- group/2148555 # 2148555 – SilentGhost

Odpowiedz

5
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] 

więc funkcja ta wykorzystuje defaultdict policzyć liczbę każdego wpisu w naszej liście. Następnie bierzemy każdą parę pozycji i jej liczbę i sortujemy ją w porządku malejącym według liczby. Następnie przyjmujemy liczbę top i zwracamy.

Więc teraz możemy powiedzieć

>>> 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)] 
+1

Idealny. Dziękuję Ci – AP257

5

Dwu-liner:

for count, elem in sorted(((mylist.count(e), e) for e in set(mylist)), reverse=True): 
    print '%s (%d)' % (elem, count) 
Powiązane problemy