2014-09-12 6 views
2

Есть ли способ (в python), в котором я могу сортировать список по его частоте?Список сортировки по частоте в python

Например,

[1,2,3,4,3,3,3,6,7,1,1,9,3,2] 

приведенный выше список будет отсортирован в порядке частоты его значений, чтобы создать следующий список, в котором элемент с наибольшей частотой помещается на передней панели:

[3,3,3,3,3,1,1,1,2,2,4,6,7,9] 

ответ

11

Я думаю, что это будет хорошая работа для collections.Counter:

counts = collections.Counter(lst) 
new_list = sorted(lst, key=lambda x: -counts[x]) 

В качестве альтернативы, вы можете написать вторую строку без лямбды:

counts = collections.Counter(lst) 
new_list = sorted(lst, key=counts.get, reverse=True) 
+0

должны были быть моим ответом. избили меня до него :-) –

+1

'key = cnt.get, reverse = True' также работает. – unutbu

+0

@unutbu - я играл с добавлением этого ответа. , , Может быть, с тех пор, как вы это указали. , , – mgilson

3
l = [1,2,3,4,3,3,3,6,7,1,1,9,3,2] 
print sorted(l,key=l.count,reverse=True) 

[3, 3, 3, 3, 3, 1, 1, 1, 2, 2, 4, 6, 7, 9] 
+3

У этого недостатка есть каждый вызов 'key' - O (n), где с' collections.Counter' это O (1), с одним вызовом O (n) для создания 'Counter' (я не сделал downvote, просто хотел указать на разницу в эффективности). – dano

+0

@dano, я до сих пор не понимаю, почему он должен быть downvoted –

+0

См. Мое редактирование. Не я. – dano

Смежные вопросы