Словари в Python не имеют специальных методов, позволяющих сортировать элементы по значениям. Поэтому сортировка словаря по значению осуществляется при помощи других структур данных, например списков.
Допустим у нас есть словарь markdict, содержащий имена и оценки студентов.
Класс dict имеет метод items(), который возвращает представление элементов словаря в виде списка кортежей. Эти кортежи содержат по одной паре ключ-значение.
markdict = {"Tom": 67, "Tina": 54, "Akbar": 87, "Kane": 43, "Divya": 73}
marklist = list(markdict.items())
print(marklist)
# Результат:
# [('Tom', 67), ('Tina', 54), ('Akbar', 87), ('Kane', 43), ('Divya', 73)]
От редакции Pythonist. О методе items() и других словарных методах можно почитать в статье «Словари в Python».
Получив список, его элементы запросто можно выстроить в определенном порядке. Например, чтобы упорядочить кортежи по оценкам, мы можем применить простую сортировку пузырьком:
markdict = {"Tom": 67, "Tina": 54, "Akbar": 87, "Kane": 43, "Divya": 73}
marklist = list(markdict.items())
l = len(marklist)
for i in range(l - 1):
for j in range(i + 1, l):
if marklist[i][1] > marklist[j][1]:
t = marklist[i]
marklist[i] = marklist[j]
marklist[j] = t
sortdict = dict(marklist)
print(sortdict)
# Результат:
# {'Kane': 43, 'Tina': 54, 'Tom': 67, 'Divya': 73, 'Akbar': 87}
Сортировка словаря по значению при помощи метода sorted()
Но сортировка списка — медленное и неэффективное решение. Библиотека встроенных функций Python предлагает лучший вариант — функцию sorted(). По умолчанию эта функция сортирует словарь по ключу, но с применением дополнительных функций возможна и сортировка словаря по значению.
markdict = {"Tom": 67, "Tina": 54, "Akbar": 87, "Kane": 43, "Divya": 73}
marklist = sorted(markdict.items(), key=lambda x: x[1])
sortdict = dict(marklist)
print(sortdict)
# Результат:
# {'Kane': 43, 'Tina': 54, 'Tom': 67, 'Divya': 73, 'Akbar': 87}
Еще с функцией sorted() можно использовать функцию itemgetter(), которая определена в модуле operator стандартной библиотеки Python. Функция itemgetter() возвращает вызываемый объект из своего операнда.
import operator
markdict = {"Tom": 67, "Tina": 54, "Akbar": 87, "Kane": 43, "Divya": 73}
marklist = sorted(markdict.items(), key=operator.itemgetter(1))
sortdict = dict(marklist)
print(sortdict)
# Результат:
# {'Kane': 43, 'Tina': 54, 'Tom': 67, 'Divya': 73, 'Akbar': 87}
Наконец, с функцией sorted() можно использовать метод dict.items(), чтобы сначала получить кортежи вида (оценка, имя), а затем пересобрать словарь, упорядоченный по оценкам.
markdict = {"Tom": 67, "Tina": 54, "Akbar": 87, "Kane": 43, "Divya": 73}
marklist = sorted((value, key) for (key, value) in markdict.items())
sortdict = dict([(k, v) for v, k in marklist])
print(sortdict)
# Результат:
# {'Kane': 43, 'Tina': 54, 'Tom': 67, 'Divya': 73, 'Akbar': 87}
Перевод статьи «How to sort dictionary by value in Python?».

