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