Сортировка Python: сортировка словаря по значению (DESC), затем по ключу (ASC)

Сразу после обнаружения удивительной сортировки(), я снова застрял.

Проблема заключается в том, что у меня есть словарь строки формы (key): integer (value), и мне нужно отсортировать его в порядке убывания его целочисленных значений, НО если два элемента, для которых есть одно и то же значение, то по возрастанию ключа.

Пример, чтобы сделать его понятным:

    d = {'banana':3, 'orange':5, 'apple':5}
    out: [('apple', 5), ('orange', 5), ('banana', 3)]

После некоторых исследований я пришел к чему-то вроде:

    sorted(d.items(), key=operator.itemgetter(1,0), reverse=True)
    out: [('orange', 5), ('apple', 5), ('banana', 3)]

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

Я бы очень признателен за помощь здесь. Спасибо заранее!

Ответ 1

Что-то вроде

In [1]: d = {'banana': 3, 'orange': 5, 'apple': 5}

In [2]: sorted(d.items(), key=lambda x: (-x[1], x[0]))
Out[2]: [('apple', 5), ('orange', 5), ('banana', 3)]

Ответ 2

  • Словарь не может быть отсортирован напрямую, поэтому вам нужно отсортировать элементы(), список кортежей, содержащих пары ключ/значение.

  • Поскольку вы хотите отсортировать по полю значения, затем по ключевым полям, необходимо извлечь это поле из кортежа для использования в качестве ключа сортировки с помощью operator.itemgetter, который получает указанное поле.

  • Наконец, чтобы сортировать по убыванию в одном поле и спускаться по другому, выполните два прохода, сначала отсортируйте по второму ключу по возрастанию, а затем еще одну сортировку по первому спускающему ключу. Этот шаг основан на Python стабильности сортировки.

Например:

import operator
In [1]: d = {'banana': 3, 'orange': 5, 'apple': 5}

In [2]: fruit = sorted(d.items(), key=operator.itemgetter(0))
In [3]: sorted(fruit, key=operator.itemgetter(1), reverse=True)
Out[3]: [('apple', 5), ('orange', 5), ('banana', 3)]

Подробнее см. Python Sorting-HOWTO.