Архив метки: tips and tricks

Python tips: сортировка словаря по значениям и ключам

 

В процессе изучения Python я столкнулся с задачей, которую в явном виде Google отказывался решить — как отсортировать словарь (Python dictionary) и по значениям (values) и ключам (keys), да ещё и чтобы значения шли по убыванию, а ключи по возрастанию?

Например, у нас есть словарь, в котором ключи — буквы алфавита, а значения — некие числа:

my_dict = {'a': 1, 'b': 3, 'c': 5,'d': 5}

Очевидно, что простая сортировка работает не очень хорошо в данном случае: так как порядок объектов в словаре в Python определяется не порядком добавления, а хэшем, работать с индексами напрямую не получится.

В результате собственных мытарство алгоритм получился следующий — сделать из словаря список, в котором каждый элемент — список из ключа и значения, причём в общий словарь их добавлять в отсортированном порядке.

sl = sorted(sorted([ [v[1],v[0]] for v in my_dict.items()], key=lambda x: x[1]), key=lambda x: x[0], reverse=True)
final = [ sl[i] for i in range(0,len(sl))][0][1]

Но позже оказалось, что всё гораздо проще можно сделать 🙂 в модуле Collections есть функция OrderedDict, с которой моя задача становится достаточно тривиальной:

from collections import OrderedDict
ret = OrderedDict(sorted(my_dict.items(), key=lambda x: x[0], reverse=False))
ret = OrderedDict(sorted(ret.items(), key=lambda x: x[1], reverse=True))