Мне было поручено сгруппировать список по частоте.Это очень распространенный вопрос о SOF, и до сих пор форум был очень образовательным.Однако из всех приведенных примеров только один следует за этими периметрами:
- Сортирует заданную итерацию так, чтобы ее элементы оказались в порядке убывания частоты.
- Если два элемента имеютна той же частоте они должны заканчиваться в том же порядке, что и первое появление в итерируемом.
Используя эти два списка:
[4, 6, 2, 2, 6, 4, 4, 4]
[17, 99, 42]
Следующие общие коды приведены в качестве решений дляэтот вопрос не удался.
from collections import Counter
freq = Counter(items)
# Ex 1
# The items dont stay grouped in the final list :(
sorted(items, key = items.count, reverse=True)
sorted(items, key=lambda x: -freq[x])
[4, 4, 4, 4, 6, 2, 2, 6]
# Ex 2
# The order that the items appear in the list gets rearranged :(
sorted(sorted(items), key=freq.get, reverse=True)
[4, 4, 4, 4, 2, 2, 6, 6]
# Ex 3
# With a list of integers, after the quantity gets sorted,
# the int value gets sorted :(
sorted(items, key=lambda x: (freq[x], x), reverse=True)
[99, 42, 17]
Я нашел решение, которое прекрасно работает, хотя:
s_list = sorted(freq, key=freq.get, reverse=True)
new_list = []
for num in s_list:
for rep in range(freq[num]):
new_list.append(num)
print(new_list)
Хотя я не могу понять, как второй цикл ссылается на число вхождений.
Я запустил процесс через pythontutor, чтобы визуализировать его, и код, кажется, просто знает, что в списке «items» есть четыре «4», два «6» и два «2».Единственное решение, о котором я могу подумать, это то, что python может ссылаться на список в глобальном фрейме без его имени.Или, возможно, возможность использовать значение из словаря "freq".Это правильно?
ссылка на поток: Сортировка списка по частоте в python