2010-02-18 3 views
5

В Python, у меня есть список элементов, таких как:Python: как отсортировать количество элементов в списке?

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

И я хотел бы, чтобы вывести что-то вроде:

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

Как я могу вывести счетчик и лидеров элементов в список? Я не слишком беспокоюсь об эффективности, так или иначе работает :)

Спасибо!

+1

, что вы пробовали? на SO есть множество обманов. Вы хотя бы пытались найти их? – SilentGhost

+0

Да, у меня есть. Извините, я могу использовать неправильные условия поиска, но я не мог найти ничего похожего на то, что мне было нужно. Я экспериментировал, но не получил очень далеко ... извинения – AP257

+2

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

ответ

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] 

Так эта функция использует defaultdict для подсчета количества каждой записи в нашем списке. Затем мы берем каждую пару записи и ее счет и сортируем ее в порядке убывания по счету. Затем мы берем top количество записей и возвращаем их.

Так что теперь мы можем сказать,

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

Отлично. спасибо – AP257

5

Два лайнера:

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