2010-02-18 5 views
5

En Python, tengo una lista de elementos como:Python: cómo obtener el recuento ordenado de los elementos en una lista?

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

y me gustaría dar salida algo como:

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

Cómo puedo salida de un recuento y clasificación de las partidas en ¿una lista? No estoy demasiado preocupado por la eficiencia, simplemente cualquier forma que funcione :)

¡Gracias!

+1

lo ha intentado? hay muchos tontos en SO. ¿Al menos has intentado buscarlos? – SilentGhost

+0

Sí, tengo. Lo siento, podría estar usando términos de búsqueda incorrectos, pero no pude encontrar nada que se pareciera a lo que necesitaba. He estado experimentando pero no he llegado muy lejos ... disculpas – AP257

+2

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

Respuesta

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] 

Así que esta función utiliza un defaultdict para contar el número de cada entrada en la lista. Luego tomamos cada par de la entrada y su conteo y lo ordenamos en orden descendente según el recuento. Luego tomamos el número de entradas top y lo devolvemos.

Así que ahora podemos decir

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

Perfecto. Gracias – AP257

5

dos forro:

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