Як відсортувати словник за значенням у Python

Вступ

Словник у Python — це набір елементів, який зберігає дані як пари ключ-значення. У Python 3.7 і пізніших версіях словники сортуються за порядком вставки елементів. У попередніх версіях вони були невпорядкованими.

У цій статті ми розглянемо, як ми можемо сортувати словник на основі значень, які він містить.

Сортувати словник за допомогою a та цінності Петля

Ми можемо сортувати словник за допомогою a 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 це функція, яка викликається для кожного елемента перед порівнянням значень для сортування. The 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() функція для більш стислого вирішення сортування словників за значеннями.

Сортувати словник за допомогою оператор Модуль і 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() є найпопулярнішою та найнадійнішою для сортування словника за значеннями.

Часова мітка:

Більше від Stackabuse