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

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

Вступление

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

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus