Основная идея скопирована с здесь .
from collections import OrderedDict
diction = {"Book":(1, 2), "Armchair":(2, 2), "Lamp":(1, 3)}
diction_list = list(diction.items())
diction = OrderedDict(sorted(diction_list, key=lambda x: (-x[1][1], x[0])))
print(diction)
OrderedDict([('Lamp', (1, 3)), ('Armchair', (2, 2)), ('Book', (1, 2))])
Вот где происходят маги c:
sorted(diction_list, key=lambda x: (-x[1][1], x[0]))
sorted
сортирует вещи для вас. Это очень хорошо в этом. Если вы используете параметр key
с сортировкой, вы можете назначить ему функцию для каждого сортируемого элемента. В этом случае мы даем в lambda
, который возвращает отрицательное значение из кортежей -x[1][1]
(это второе значение в кортеже) и ключ x[0]
. Отрицательный знак делает его в обратном порядке. Конечно, это не будет работать с ненулевыми значениями c.
OrderedDict
вещь не является строго необходимой. Python поддерживает порядок после версии 3.6, я думаю (или это было 3.7?). OrderedDicts всегда хранятся в одном и том же порядке, поэтому наш dict остается упорядоченным независимо от версии Python.
Чтобы лучше это сделать, см. Sorting HOW TO в Python Документация.