Сообщить об ошибке.

Сортировка словаря по значению и/или ключу в Python

Сортировка словарей производится при помощи встроенной функцией sorted() и происходит немного сложнее чем сортировка списков или кортежей.

Сортировка словаря по ключу.

Функция sorted() работает со всеми объектами, которые поддерживают итерирование. Словарь, в свою очередь при итерировании, выдает только ключи, но нам необходимо получить исходный отсортированный словарь, а не только отсортированные ключи. Следовательно из словаря необходимо получить итерацию [(key, val), (key, val), ...], затем отсортировать ее по значению key и преобразовать обратно в словарь.

Список кортежей (key, val) можно получить методом словаря dict.items().

>>> d = {'b': 9, 'a': 3, 'c': 7}
# получаем итерацию кортежей `(key, val)`
>>> d.items()
# dict_items([('b', 9), ('a', 3), ('c', 7)]) # то что нужно

Так как значение key стоит первым, то и ключ для сортировки укажем как lambda x: x[0], где x - это кортеж (key, val)

# исходный словарь
>>> d = {'b': 9, 'a': 3, 'c': 7}
# собственно сама сортировка
>>> sorted_tuple = sorted(d.items(), key=lambda x: x[0])
# получили отсортированный список кортежей, 
# отсортированных по первому значению
>>> sorted_tuple
# [('a', 3), ('b', 9), ('c', 7)]
# преобразовываем обратно в словарь
dict(sorted_tuple)
# {'a': 3, 'b': 9, 'c': 7}

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

Применяя методику сортировки описанную выше, можно легко догадаться как сортировать словарь по значению. Для этого просто укажем в качестве ключа сортировки индекс значения словаря в полученном списке кортежей: lambda x: x[1], где x - это кортеж (key, val)

>>> d = {'b': 9, 'a': 3, 'c': 7}
>>> sorted_tuple = sorted(d.items(), key=lambda x: x[1])
>>> sorted_tuple
# [('a', 3), ('c', 7), ('b', 9)]
# преобразовываем обратно в словарь
>>> dict(sorted_tuple)
# {'a': 3, 'c': 7, 'b': 9}

Теперь запишем в одну строку:

>>> d = {'b': 9, 'a': 3, 'c': 7}
>>> {k: v for k, v in sorted(d.items(), key=lambda item: item[1])}
# {'a': 3, 'c': 7, 'b': 9}

Для получения ключа сортировки из dict.items(), так же можно использовать функцию operator.itemgetter():

>>> d = {'b': 9, 'a': 3, 'c': 7}
>>> import operator
>>> sorted_tuple = sorted(d.items(), key=operator.itemgetter(1))
>>> sorted_tuple
# [('a', 3), ('c', 7), ('b', 9)]
>>> dict(sorted_tuple)
# {'a': 3, 'c': 7, 'b': 9}

# и в одну строку
{k: v for k, v in sorted(d.items(), key=operator.itemgetter(1)}
# {'a': 3, 'c': 7, 'b': 9}

Быстрая сортировка словаря при помощи модуля sortedcontainers

Для быстрой сортировки словаря dict необходимо установить сторонний модуль pip install sortedcontainers (желательно в виртуальное окружение).

Этот модуль предназначен для быстрой (как C-расширение) сортировки коллекций, таких как list, set, dict.

>>> from sortedcontainers import SortedDict
>>> sd = SortedDict({'c': -3, 'a': 1, 'b': 2})
>>> sd
# SortedDict({'a': 1, 'b': 2, 'c': -3})
>>> sd.popitem(index=-1)
# ('c', -3)

Код выше, выполняются быстрее линейного времени и потребляет на 66% меньше накладных расходов.