Отсортируйте данный итератор таким образом, чтобы его элементы оказались в порядке убывания частоты их появления
Функция должна выдавать такие значения:
frequency_sort([4, 6, 2, 2, 6, 4, 4, 4]) == [4, 4, 4, 4, 6, 6, 2, 2]
frequency_sort(['bob', 'bob', 'carl', 'alex', 'bob']) == ['bob', 'bob', 'bob', 'carl', 'alex']
frequency_sort([17, 99, 42]) == [17, 99, 42]
Однако моя программа:
def frequency_sort(items):
return sorted(items, key= lambda part: -items.count(part))
Выдает значения немного в другом порядке, например:
↓ ↓ ↓ ↓
[4, 4, 4, 4, 6, 2, 2, 6] вместо [4, 4, 4, 4, 6, 6, 2, 2]
При попытке добавления пред сортировки по дефолту, появляются проблемы с другими строками:
вместо ['bob', 'bob', 'bob', 'carl', 'alex'] выводит ['bob', 'bob', 'bob', 'alex', 'carl']
и вместо [17, 99, 42] выводит [17, 42, 99]
В общем лучший вариант это пока что тот, что я предложил выше (потому что проблема так только в одной строке), но как исправить это я ума не приложу
Ответы (1 шт):
Автор решения: GrAnd
→ Ссылка
Вариант 1.
При одинаковом количестве элементы сортируются по возрастанию.
def frequency_sort(items):
return sorted(items, key=lambda part: (-items.count(part), part))
[4, 4, 4, 4, 2, 2, 6, 6]
['bob', 'bob', 'bob', 'alex', 'carl']
[17, 42, 99]
Вариант 2.
При одинаковом количестве элементы сортируются по порядку их следования в изначальном списке.
def frequency_sort(items):
return sorted(items, key=lambda part: (-items.count(part), items.index(part)))
[4, 4, 4, 4, 6, 6, 2, 2]
['bob', 'bob', 'bob', 'carl', 'alex']
[17, 99, 42]