Словари в 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} Но сортировка списка — медленное и неэффективное решение. Библиотека встроенных функций 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?».
Если вы ищете работу на Python, на Talanto.work сейчас есть варианты для junior, middle, senior…
Рынок Python-вакансий большой, но удобным его назвать сложно. Формально вакансий много, однако в реальном поиске…
Срезы в Python — это больше, чем a[2:7]. В статье — быстрый разбор полезных приёмов:…
В этой статье мы рассмотрим возведение в степень в Python с помощью различных методов, от…
Дубликаты в списке Python — частая проблема. В статье показано, как быстро убрать повторы, в…
Услуга виртуального хостинга на SpaceWeb позволяет арендовать часть сервера (shared-сервера) и разместить на нём свой…