2010-02-18 14 views
5

In Python, ho un elenco di elementi come:Python: come ottenere il numero ordinato di elementi in un elenco?

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

E mi piacerebbe uscita qualcosa di simile:

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

Come posso produrre un conteggio e leaderboard di elementi in una lista? Non sono troppo preoccupato per l'efficienza, solo in qualsiasi modo funziona :)

Grazie!

+1

cosa hai provato? ci sono un sacco di imbrogli su SO. Hai almeno provato a cercarli? – SilentGhost

+0

Sì, ho. Spiacenti, potrei usare i termini di ricerca sbagliati ma non sono riuscito a trovare nulla che assomigliasse a ciò di cui avevo bisogno. Ho fatto esperimenti ma non ho ottenuto molto lontano ... scuse – AP257

+2

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

risposta

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] 

Quindi questa funzione utilizza un defaultdict per contare il numero di ciascuna voce nella nostra lista. Prendiamo quindi ogni coppia della voce e il suo conteggio e la ordiniamo in ordine decrescente in base al conteggio. Prendiamo quindi il numero top di voci e lo restituiamo.

Così ora possiamo dire

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

Perfetto. Grazie – AP257

5

A due-liner:

for count, elem in sorted(((mylist.count(e), e) for e in set(mylist)), reverse=True): 
    print '%s (%d)' % (elem, count) 
Problemi correlati