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

Марина

Recent Posts

Библиотека Pydantic: валидация данных на Python

Pydantic - это мощная библиотека проверки данных и управления настройками для Python, созданная для повышения…

2 дня ago

7 наилучших библиотек визуализации Python на 2024 год

Python предлагает набор библиотек, удовлетворяющих различные потребности в визуализации, будь то академические исследования, бизнес-аналитика или…

6 дней ago

Как преобразовать строку в байты в Python

В Python для представления данных в двоичной форме можно использовать байты. Из этой статьи вы…

2 недели ago

Что такое Werkzeug?

В этой статье рассказывается о том, что такое Werkzeug и как Flask использует его для…

3 недели ago

Как прибавить дни, месяцы и годы к дате в Python

При работе с датами часто возникает необходимость прибавлять к дате или вычитать из нее различные…

4 недели ago

Социальная аутентификация в приложении на Flask

В этом руководстве мы рассмотрим, как добавить социальную аутентификацию с помощью GitHub и Google в…

1 месяц ago