Сортировка OrderedDict по возрастанию и по убыванию - PullRequest
0 голосов
/ 23 февраля 2020

Определите:

diction = {"Book":(1, 2), "Armchair":(2, 2), "Lamp":(1, 3)}

Если кто-то хочет отсортировать этот словарь по элементу ["ключ"] [1] по убыванию и по "ключам" по возрастанию, что будет подходящим путь?

Желаемый результат:

diction = {"Lamp":(1, 3), "Armchair":(2, 2), "Book":(1, 2)}

После получения правильного ответа от Синан Обратите внимание, что я не спрашивал о сортировке ни по возрастанию, ни по убыванию, что вы отправили мне соответствующие ссылки! Я спросил о том, чтобы делать оба одновременно, что не решается уловкой минуса, данной Синаном.

1 Ответ

1 голос
/ 23 февраля 2020

Основная идея скопирована с здесь .

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 Документация.

...