Сортировка словаря

На самом деле содержимое словаря отсортировать нельзя, так как словарь в Python - это неупорядоченная структура данных, доступ к элементам которой осуществляется по ключам, а не индексам.

Следует отметить, что в последних релизах Python словари помнят порядок добавления в них элементов. Таким образом, словарь изначально может заполняться так или иначе отсортированной последовательностью пар "ключ:значение".

Однако чаще всего мы имеем дело с неупорядоченными словарями. При просмотре элементов словаря можно сделать так, чтобы это происходило согласно определенному порядку. Для этого дополнительно используется упорядоченная структура, которую можно отсортировать (список или кортеж).

Сортировка по ключам

Проще всего выполнить сортировку словаря по ключам. Алгоритм вывода содержимого словаря:

  1. Создать список ключей словаря.
  2. Отсортировать его.
  3. В цикле for перебрать элементы списка, используя элемент списка как ключ словаря.
>>> d = {'t': 4, 'm': 2, 'x': 3, 'a': 10}
>>> list_keys = list(d)
>>> list_keys
['t', 'm', 'x', 'a']
>>> list_keys.sort()
>>> list_keys
['a', 'm', 't', 'x']
>>> for i in list_keys:
...     print(i + ':', d[i])
...
a: 10
m: 2
t: 4
x: 3

Функция sorted() позволяет сразу создать список отсортированных ключей словаря. Поэтому пример выше упрощается до такого:

>>> d = {'t': 4, 'm': 2, 'x': 3, 'a': 10}
>>> for i in sorted(d):
...     print(i + ':', d[i])
...
a: 10
m: 2
t: 4
x: 3

Сортировка по значениям

Отсортировать словарь по значениям сложнее, так как обращаться к элементам словаря можно только по ключам. Однако можно создать список кортежей ("ключ", "значение") и отсортировать его по вторым элементам пар.

>>> d = {'t': 4, 'm': 2, 'x': 3, 'a': 10}
>>> list_d = list(d.items())
>>> list_d
[('t', 4), ('m', 2), ('x', 3), ('a', 10)]
>>> list_d.sort(key=lambda i: i[1])
>>> list_d
[('m', 2), ('x', 3), ('t', 4), ('a', 10)]
>>> for k, v in list_d:
...     print(k + ':', v)
...
m: 2
x: 3
t: 4
a: 10

Если бы мы использовали метод sort() без параметра key, то сортировка была бы выполнена по первым элементам кортежей. В качестве значения для key указывается функция. В данном случае используется lambda-функция, что уменьшает объем кода. В функцию передаются кортежи, а возвращаются их вторые элементы, по которым происходит сортировка.

Также можно использовать функцию sorted():

>>> d = {'t': 4, 'm': 2, 'x': 3, 'a': 10}
>>> t = sorted(d.items(), key=lambda i: i[1])
>>> t
[('m', 2), ('x', 3), ('t', 4), ('a', 10)]

Класс OrderedDict модуля collections

В модуле collections имеется класс OrderedDict, который является подклассом класса dict, то есть обычного встроенного в Python словаря. OrderedDict позволяет создавать объекты-словари, которые помнят порядок своих элементов. Также класс имеет ряд методов, которые предназначены для изменения порядка элементов в словаре.

>>> from collections import OrderedDict
>>> od = OrderedDict({'t': 4, 'm': 2, 'x': 3, 'a': 10})
>>> od
OrderedDict([('t', 4), ('m', 2), ('x', 3), ('a', 10)])
>>> item = min(od, key=lambda i: od[i])
>>> item
'm'
>>> od.move_to_end(item, last=False)
>>> od
OrderedDict([('m', 2), ('t', 4), ('x', 3), ('a', 10)])