DevGang
Авторизоваться

Как отсортировать словарь по значению в Python 

Словарь в Python - это набор элементов, в которых данные хранятся в виде пар ключ-значение. В Python 3.7 и более поздних версиях словари сортируются по порядку вставки элементов. В более ранних версиях они были неупорядоченными.

Давайте посмотрим, как мы можем отсортировать словарь на основе содержащихся в нем значений.

Сортировка словаря с помощью цикла for

Мы можем отсортировать словарь с помощью цикла for. Сначала мы используем функцию sorted() для упорядочивания значений словаря. Затем мы перебираем отсортированные значения, находя ключи для каждого значения. Мы добавляем эти пары ключ-значение в отсортированном порядке в новый словарь.

Примечание. Сортировка не позволяет изменять порядок словаря на месте. Записываем упорядоченные пары в совершенно новый пустой словарь.

dict1 = {1: 1, 2: 9, 3: 4}
sorted_values = sorted(dict1.values()) # Sort the values
sorted_dict = {}

for i in sorted_values:
    for k in dict1.keys():
        if dict1[k] == i:
            sorted_dict[k] = dict1[k]
            break

print(sorted_dict)

Если вы запустите это с помощью интерпретатора Python, вы увидите:

{1: 1, 3: 4, 2: 9}

Теперь, когда мы увидели, как выполнять сортировку с помощью циклов, давайте рассмотрим более популярную альтернативу, использующую эту функцию sorted().

Сортировка словаря с использование функция sorted()

Ранее мы использовали эту функцию для сортировки значений массива. При сортировке словаря, мы можем передать еще один аргумент к функции: sorted(dict1, key=dict1.get).

Вот функция key, которая вызывается для каждого элемента перед сравнением значений для сортировки. Метод get() по словарю объектов возвращает значение для ключа словаря.

Выражение sorted(dict1, key=dict1.get) возвращает список ключей, значения сортируются по порядку. Оттуда мы можем создать новый отсортированный словарь:

dict1 = {1: 1, 2: 9, 3: 4}
sorted_dict = {}
sorted_keys = sorted(dict1, key=dict1.get)  # [1, 3, 2]

for w in sorted_keys:
    sorted_dict[w] = dict1[w]

print(sorted_dict) # {1: 1, 3: 4, 2: 9}

Использование функции sorted() сократило объем кода, который нам приходилось писать при использовании циклов for. Однако мы можем дополнительно комбинировать функцию sorted() с itemgetter() для более лаконичного решения сортировки словарей по значениям.

Сортировка словаря с помощью модуля operator и itemgetter()

Модуль operator включает в себя функцию itemgetter(). Эта функция возвращает вызываемый объект, который возвращает элемент из объекта.

Например, давайте использовать itemgetter() для создания вызываемого объекта, который возвращает значение любого словаря с ключом, который 2:

import operator

dict1 = {1: 1, 2: 9}
get_item_with_key_2 = operator.itemgetter(2)

print(get_item_with_key_2(dict1))  # 9

Каждый словарь имеет доступ к методу items(). Эта функция возвращает пары "ключ-значение" словаря в виде списка кортежей. Мы можем отсортировать список кортежей, используя функцию itemgetter() для извлечения второго значения кортежа, то есть значения ключей в словаре.

После сортировки мы можем создать словарь на основе этих значений:

import operator

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  # [(1, 1), (3, 4), (2, 9)]
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict) # {1: 1, 3: 4, 2: 9}

С гораздо меньшими усилиями у нас есть словарь, отсортированный по значениям!

Поскольку аргумент key принимает любую функцию, мы можем использовать лямбда-функции для возврата значений словаря, чтобы их можно было отсортировать. Посмотрим как.

Сортировка словаря с помощью лямбда-функции

Лямбда-функции в Python являются анонимными или безымянными функциями. Мы можем использовать lamba-функции для получения значения элемента словаря без необходимости импорта модуля operator для itemgetter().

Давайте отсортируем словарь по значениям, используя лямбда-функцию в аргументе key:

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=lambda item: item[1])
print(sorted_tuples)  # [(1, 1), (3, 4), (2, 9)]
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict)  # {1: 1, 3: 4, 2: 9}

Обратите внимание, что методы, которые мы обсуждали до сих пор, работают только с Python 3.7 и новее. Давайте посмотрим, что мы можем сделать для более ранних версий Python.

Возврат нового словаря с отсортированными значениями

После сортировки словаря по значениям, чтобы сохранить отсортированный словарь в версиях Python до 3.7, вы должны использовать OrderedDict - доступный в модуле collections. Эти объекты представляют собой словари, сохраняющие порядок вставки.

Вот пример сортировки и использования OrderedDict:

import operator
from collections import OrderedDict

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  # [(1, 1), (3, 4), (2, 9)]

sorted_dict = OrderedDict()
for k, v in sorted_tuples:
    sorted_dict[k] = v

print(sorted_dict)  # {1: 1, 3: 4, 2: 9}

Вывод

В этом руководстве показано, как можно отсортировать словарь на основе его значений. Сначала мы отсортировали словарь, используя два цикла for. Затем мы улучшили нашу сортировку с помощью функции sorted(). Мы также видели, что функция itemgetter() модуля  operator может сделать наше решение более лаконичным.

Наконец, мы адаптировали наше решение для работы с версиями Python ниже 3.7.

Варианты функции sorted() - самые популярные и надежные для сортировки словаря по значениям.

Источник:

#Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Поделитесь своим опытом, расскажите о новом инструменте, библиотеке или фреймворке. Для этого не обязательно становится постоянным автором.

Попробовать

Оплатив хостинг 25$ в подарок вы получите 100$ на счет

Получить