Сортировка словарей производится при помощи встроенной функцией 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}
Для получения ключа сортировки из 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}