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