Рубрики
Без рубрики

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

В этой статье мы рассмотрим, как отсортировать словарь в Python по его значению. Эти решения используют циклы и функцию sorted (), а также лямбды и операторный модуль.

Автор оригинала: Naazneen Jatu.

Как отсортировать словарь по значению в 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() для сортировки значений массива. При сортировке словаря мы можем передать еще один аргумент функции sorted() следующим образом: sorted(dict1,.get) .

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

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

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() для более краткого решения задачи сортировки словарей по значениям.

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

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

Например, давайте используем to 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() . Если вы хотите узнать больше о лямбда-функциях, вы можете прочитать о них в нашем руководстве по Лямбда-функциям в Python .

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

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() являются наиболее популярными и надежными для сортировки словаря по значениям.