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

Функция должна выдавать такие значения:

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]
→ Ссылка