Сортировать список по частоте
Есть ли способ в 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]
Ответы
Ответ 1
Я думаю, что это было бы хорошей работой для 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)
Если у вас есть несколько элементов с одинаковой частотой, и вы заботитесь о том, чтобы они оставались сгруппированными, мы можем сделать это, изменив наш ключ сортировки, включив в него не только число, но и значение:
counts = collections.Counter(lst)
new_list = sorted(lst, key=lambda x: (counts[x], x), reverse=True)
Ответ 2
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
Практиковал это для удовольствия. Это решение использует меньше времени.
from collections import defaultdict
lis = [1,2,3,4,3,3,3,6,7,1,1,9,3,2]
dic = defaultdict(int)
for num in lis:
dic[num] += 1
s_list = sorted(dic, key=dic.__getitem__, reverse=True)
new_list = []
for num in s_list:
for rep in range(dic[num]):
new_list.append(num)
print(new_list)
Ответ 4
Вы можете использовать Counter
чтобы получить счетчик каждого элемента, использовать метод most_common
чтобы получить его в отсортированном порядке, а затем использовать понимание списка, чтобы снова расширить
>>> lst = [1,2,3,4,3,3,3,6,7,1,1,9,3,2]
>>>
>>> from collections import Counter
>>> [n for n,count in Counter(lst).most_common() for i in range(count)]
[3, 3, 3, 3, 3, 1, 1, 1, 2, 2, 4, 6, 7, 9]
Ответ 5
Если вы хотите использовать двойной компаратор.
Например: сортируйте список по частоте в порядке убывания, и в случае коллизии первым будет меньший.
import collections
def frequency_sort(a):
f = collections.Counter(a)
a.sort(key = lambda x:(-f[x], x))
return a
Ответ 6
from collections import Counter
a = [2, 5, 2, 6, -1, 9999999, 5, 8, 8, 8]
count = Counter(a)
a = []
while len(count) > 0:
c = count.most_common(1)
for i in range(c[0][1]):
a.append(c[0][0])
del count[c[0][0]]
print(a)
Ответ 7
Вы можете использовать ниже методы. Это написано на простом питоне.
def frequencyIdentification(numArray):
frequency = dict({});
for i in numArray:
if i in frequency.keys():
frequency[i]=frequency[i]+1;
else:
frequency[i]=1;
return frequency;
def sortArrayBasedOnFrequency(numArray):
sortedNumArray = []
frequency = frequencyIdentification(numArray);
frequencyOrder = sorted(frequency, key=frequency.get);
loop = 0;
while len(frequencyOrder) > 0:
num = frequencyOrder.pop()
count = frequency[num];
loop = loop+1;
while count>0:
loop = loop+1;
sortedNumArray.append(num);
count=count-1;
print("loop count");
print(loop);
return sortedNumArray;
a=[1, 2, 3, 4, 3, 3, 3, 6, 7, 1, 1, 9, 3, 2]
print(a);
print("sorted array based on frequency of the number");
print(sortArrayBasedOnFrequency(a));