В Python, как мне взять наибольшее вхождение чего-либо в списке и отсортировать его таким образом? - PullRequest
4 голосов
/ 25 января 2011
[3, 3, 3, 4, 4, 2]

Будет:

[ (3, 3), (4, 2), (2, 1) ]

Выходные данные должны быть отсортированы по наибольшему количеству с первого по наименьшее.В этом случае от 3 до 2 до 1.

Ответы [ 5 ]

13 голосов
/ 25 января 2011

Вы можете использовать Счетчик в Python 2.7+ ( этот рецепт работает на 2.5 +):

from collections import Counter
print Counter([3, 3, 3, 4, 4, 2]).most_common()
# [(3, 3), (4, 2), (2, 1)]
3 голосов
/ 25 января 2011
data = [3, 3, 3, 4, 4, 2]
result = []
for entry in set(data):
    result.append((entry, data.count(entry)))
result.sort(key = lambda x: -x[1])
print result

>>[(3, 3), (4, 2), (2, 1)]
2 голосов
/ 25 января 2011

Почему вы выбрали бы алгоритм O (n ** 2) для этого?Альтернатива счетчику (если у вас <2,7) не так уж сложна </p>

>>> from operator import itemgetter
>>> from collections import defaultdict
>>> L=[3, 3, 3, 4, 4, 2]
>>> D=defaultdict(int)
>>> for i in L:
...     D[i]+=1
... 
>>> sorted(D.items(), key=itemgetter(1), reverse=True)
[(3, 3), (4, 2), (2, 1)]
2 голосов
/ 25 января 2011

Попробуйте использовать коллекцию. Счетчик:

from collections import Counter
data = [3,4,2,3,4,3]
Counter(data).most_common()
0 голосов
/ 25 января 2011
def myfun(x,y):
    return x[1]-y[1]

list1 = [3, 3, 3, 4, 4, 2]
s1 = set(list1)
newlist = []
for e in s1:
    newlist.append((e,list1.count(e)))
print sorted(newlist,cmp=myfun)

Я думаю, это то, что вы просили. Извините за спешку с первым ответом. Но только обратите внимание, что аргумент cmp для отсортированного недоступен в python3

...