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

Словари в 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?».