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

Введение

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

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

Сортировка словаря с помощью для Петля

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

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

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

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

print(sorted_dict)

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

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

Теперь, когда мы увидели, как выполнять сортировку с помощью циклов, давайте рассмотрим более популярную альтернативу, использующую 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)  

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

print(sorted_dict) 

Посмотрите на график sorted() функция уменьшила объем кода, который нам приходилось писать при использовании for петли. Тем не менее, мы можем дополнительно объединить sorted() функция с 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))  

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

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

import operator

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

print(sorted_dict) 

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

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

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

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

Ознакомьтесь с нашим практическим руководством по изучению Git с рекомендациями, принятыми в отрасли стандартами и прилагаемой памяткой. Перестаньте гуглить команды Git и на самом деле изучить это!

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

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

print(sorted_dict)  

Обратите внимание, что методы, которые мы обсуждали до сих пор, работают только с 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)  

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

print(sorted_dict)  

Заключение

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

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

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

Отметка времени:

Больше от Стекабьюс