Не получается отсортировать полученный после применения collections.Counter словари

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

c = Counter({'9': 22, '0': 22, '7': 21, '3': 20, '8': 18, '2': 17, '4': 14, '6': 14, '1': 14, '5': 10})

Будет вот такой

{'0': 22, '9': 22, '7': 21, '3': 20, '8': 18, '2': 17, '1': 14, '4': 14, '6': 14, '5': 10}

И с другим словарями тоже самое

Counter({'9': 27, '4': 27, '5': 24, '7': 22, '8': 20, '2': 19, '1': 19, '0': 17, '6': 16, '3': 14})
Counter({'4': 332, '2': 332, '5': 331, '8': 331, '3': 328, '6': 324, '9': 316, '1': 310, '0': 304, '7': 303})

Мои решения - сортирую по значению два раза потом reverse один вариант сортирую сперва по значению, а потом по ключу потом reverse другой вариант

  1. c = sorted(sorted(c.items(), key=itemgetter(1)), key=itemgetter(1), reverse=True)
  2. c = sorted(sorted(c.items(), key=itemgetter(1)), key=itemgetter(0), reverse=True)

но в результате где получается сортировка, а где нет

Подскажите правильное решение!


Ответы (2 шт):

Автор решения: extrn

Сначала сортируем по ключам, потом по значениям.

c = sorted(sorted(c.items(), key=itemgetter(0)), key=itemgetter(1), reverse=True)

Т.к. сортировка устойчивая, пары, у которых значения совпадают, сохранят относительный порядок, заданный первой сортировкой. Т.е. пары с меньшими ключами, будут идти раньше пар с большими ключами, но теми же значениями.

→ Ссылка
Автор решения: mrEvgenX

Как вариант: сортировать одновременно и по значениям, и по ключам, а не сначала по одному, потом по другому.

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

sorted(c.items(), key=lambda item: (-item[1], item[0]))
→ Ссылка