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