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