Сортировка списков по повторениям в Python - PullRequest
2 голосов
/ 01 июня 2011

У меня есть список, который содержит несколько повторяющихся элементов. Я пытаюсь отсортировать список, отдавая предметы с наибольшим приоритетом повторений.

Так что бы это перевернуло

['a', 'b', 'c', 'a', 'b', 'a', 'd']

в это

['a', 'a', 'a', 'b', 'b', 'c', 'd']

Ответы [ 4 ]

5 голосов
/ 01 июня 2011
>>> from collections import Counter
>>> [k for k,v in Counter(['a', 'b', 'c', 'a', 'b', 'a', 'd']).most_common() for i in xrange(v)]
['a', 'a', 'a', 'b', 'b', 'c', 'd']

Возможно, за этим легче следовать

>>> counter = Counter(['a', 'b', 'c', 'a', 'b', 'a', 'd'])
>>> sorted(counter.elements(), key=counter.get, reverse=True)
['a', 'a', 'a', 'b', 'b', 'c', 'd']
5 голосов
/ 01 июня 2011
d = {}
for a in l:
    d[a] += d.setdefault(a,0)

l.sort(key = lambda k: (d[k],k), reverse = True)
2 голосов
/ 01 июня 2011
[v for (v, c) in sorted(((x, list(y)) for (x, y) in
  itertools.groupby(sorted(['a', 'b', 'c', 'a', 'b', 'a', 'd']))),
  key=lambda x: len(x[1]), reverse=True) for z in c]

EDIT:

Теперь с sum()!

sum((c for (v, c) in sorted(((x, list(y)) for (x, y) in
  itertools.groupby(sorted(['a', 'b', 'c', 'a', 'b', 'a', 'd']))),
  key=lambda x: len(x[1]), reverse=True)), [])
1 голос
/ 01 июня 2011
l = ['a', 'b', 'c', 'a', 'b', 'a', 'd']
sorted_list = [item for item in sorted(l, key=lambda x: l.count(x), reverse=True)]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...