У цій інструкції ви ознайомитеся з різними методами сортування словників у Python, залежно від їхніх ключів чи значень.
Під час роботи зі словниками Python, іноді виникає потреба впорядкувати їхній вміст, використовуючи ключі або значення як критерії сортування. Оскільки словник Python за своєю суттю є відображенням між ключами та значеннями, необхідно створити новий словник, в якому пари ключ-значення будуть розташовані у потрібному порядку.
У цій статті ми почнемо з короткого огляду основних концепцій, що стосуються словників Python. Потім ми розглянемо, як можна створити новий словник, де елементи будуть впорядковані за ключем або значенням, в залежності від того, що вам потрібно.
Повернення до основ словників Python
Що являє собою словник Python?
Словник – це вбудована структура даних в Python, призначена для зберігання елементів у форматі пар ключ-значення. Ключі використовуються для пошуку відповідних значень. Важливою характеристикою є те, що ключі повинні бути унікальними, оскільки саме вони однозначно ідентифікують значення.
py_dict = {"Python":"класний!","Вивчати":True} py_dict["Python"] # Вивід: класний! py_dict["Вивчати"] # Вивід: True
Функціонально словник нагадує хеш-таблицю. Відповідно, це не гарантовано впорядкована структура даних. Ви можете отримати доступ до вмісту словника в будь-якому порядку, за умови, що вам відомі ключі.
Порядок елементів у словнику
У попередніх версіях Python для збереження порядку ключів доводилося використовувати OrderedDict. Проте, починаючи з Python 3.7, елементи словника зберігаються у тому ж порядку, в якому їх було додано.
Тепер, коли ми розглянули основи словників Python, давайте перейдемо до створення відсортованих копій словників.
⚙️ Зверніть увагу: для коректної роботи коду з цього посібника, вам потрібен Python версії 3.7 або вище. Ви можете завантажити останню версію Python або запустити приклади в онлайн-редакторі Python на techukraine.net.
Як відсортувати словник Python за ключем
Розглянемо приклад меню десертів у кафе. Воно складається з двох стовпчиків: назви десертів та їхні відповідні ціни.
Цю інформацію можна представити у вигляді словника Python, де назви десертів будуть ключами, а їхні ціни – значеннями.
Створимо словник десертів, як показано нижче.
desserts = { "Морозиво":10, "Брауні":12, "Чізкейк":3, "Рулет швейцарський":5, "Печиво":4, "Кекс":2 }
Далі ми створимо новий словник під назвою `sorted_desserts`, де десерти будуть впорядковані в алфавітному порядку. У вихідному словнику `desserts` ключами є назви десертів. Тому для створення нового словника їх потрібно відсортувати в алфавітному порядку.
Як отримати доступ до ключів словника Python
Для цього спочатку отримаємо всі ключі словника, а потім відсортуємо їх в алфавітному порядку.
У Python можна скористатися методом `.keys()`, який повертає список усіх ключів словника.
Застосуємо метод `.keys()` до словника `desserts`, щоб отримати його ключі, як показано нижче.
keys = desserts.keys() print(keys) #Вивід ['Морозиво', 'Брауні', 'Чізкейк', 'Рулет швейцарський', 'Печиво', 'Кекс']
Вбудована функція `sorted()`, застосована до списку, повертає новий відсортований список.
Викличемо функцію `sorted()` зі списком ключів як аргумент та збережемо відсортований список у змінній `sorted_keys`.
sorted_keys = sorted(keys) print(sorted_keys) # Вивід ['Брауні', 'Кекс', 'Морозиво', 'Печиво', 'Рулет швейцарський', 'Чізкейк']
Тепер, маючи відсортовані в алфавітному порядку ключі, ми можемо отримати відповідні значення з вихідного словника `desserts`, як показано нижче.
sorted_desserts = {} for key in sorted_keys: sorted_desserts[key] = desserts[key] print(sorted_desserts) # Вивід {'Брауні': 12, 'Кекс': 2, 'Морозиво': 10, 'Печиво': 4, 'Рулет швейцарський': 5, 'Чізкейк': 3}
Розшифруємо цей код:
- Створюємо порожній словник `sorted_desserts`.
- Проходимося по списку ключів `sorted_keys`.
- Для кожного ключа з `sorted_keys` додаємо запис до `sorted_desserts`, отримуючи відповідне значення зі словника `desserts`.
Використання циклу `for` вважається дещо багатослівним. Python пропонує більш лаконічний підхід з використанням генератора словника.
Генератор словника в Python
Python підтримує генератори словників, подібно до генераторів списків. Це дозволяє створити новий словник Python всього за один рядок коду.
▶️ Ось загальна структура для використання генератора словника в Python.
# 1. коли є ключі та значення в двох списках: list1, list2 new_dict = {key:value for key,value in zip(list1,list2)} # 2. коли є ключі та можна отримати відповідні значення new_dict = {key:value for key in <iterable>}
Використаємо другу конструкцію: `new_dict = {key:value for key in
У цьому прикладі:
- `iterable`: список `sorted_keys`.
- `key`: ключ, до якого ми звертаємося під час ітерації по `sorted_keys`.
- `value`: значення, що відповідає ключу, отримане зі словника `desserts` за допомогою `desserts[key]`.
Зібравши все разом, отримаємо такий вираз для генератора словника:
sorted_desserts = {key:desserts[key] for key in sorted_keys} print(sorted_desserts) {'Брауні': 12, 'Кекс': 2, 'Морозиво': 10, 'Печиво': 4, 'Рулет швейцарський': 5, 'Чізкейк': 3}
Як бачимо з результату, десерти у словнику `sorted_desserts` впорядковані в алфавітному порядку.
Як відсортувати словник Python за значенням
Далі ми навчимося сортувати словник Python, використовуючи його значення.
У словнику `desserts` значення відповідають цінам десертів. Можна відсортувати словник за цінами у порядку зростання або спадання.
▶️ Для отримання всіх пар ключ-значення можна використовувати метод словника `.items()`. Кожен елемент є кортежем, що представляє пару ключ-значення.
desserts.items() dict_items([('Морозиво', 10), ('Брауні', 12), ('Чізкейк', 3), ('Рулет швейцарський', 5), ('Печиво', 4), ('Кекс', 2)])
Кожен з елементів є кортежем, а отже, до кожної пари ключ-значення можна звертатися за індексом для отримання окремо ключів або значень.
dict_items = desserts.items() for item in dict_items: print(f"ключ:{item[0]},значення:{item[1]}") # Вивід ключ:Морозиво,значення:10 ключ:Брауні,значення:12 ключ:Чізкейк,значення:3 ключ:Рулет швейцарський,значення:5 ключ:Печиво,значення:4 ключ:Кекс,значення:2
Оскільки ми хочемо відсортувати словник за значеннями, ми будемо використовувати індекс 1 (значення) кожної пари ключ-значення.
Як відсортувати значення словника Python у порядку зростання
На цей раз ми використаємо функцію `sorted()` з необов’язковим параметром `key`. Параметр `key` може бути будь-якою функцією Python, вбудованою функцією, функцією, визначеною користувачем, або навіть лямбда-функцією.
Примітка: `lambda аргументи: вираз` – це синтаксис для визначення лямбда-функцій у Python.
У цьому прикладі сортування десертів за ціною ми звертаємося до словникових елементів (пар ключ-значення). Ми встановимо `key = lambda item:item[1]`, оскільки хочемо сортувати за значенням (ціною).
Оскільки функція `sorted()` за замовчуванням повертає список, його потрібно явно перетворити на словник, як показано нижче.
sorted_desserts = dict(sorted(desserts.items(), key=lambda item:item[1])) print(sorted_desserts) {'Кекс': 2, 'Чізкейк': 3, 'Печиво': 4, 'Рулет швейцарський': 5, 'Морозиво': 10, 'Брауні': 12}
Можна також переписати цей код, використовуючи генератор словника, про який ми говорили раніше.
sorted_desserts = {key:value for key, value in sorted(desserts.items(), key=lambda item:item[1])} print(sorted_desserts) # Вивід {'Кекс': 2, 'Чізкейк': 3, 'Печиво': 4, 'Рулет швейцарський': 5, 'Морозиво': 10, 'Брауні': 12}
У словнику `sorted_desserts` торт “Кекс” за 2 долари йде першим, а брауні за 12 доларів – останнім.
Як відсортувати значення словника Python у порядку спадання
Якщо ви хочете відсортувати ціни у порядку спадання, встановіть необов’язковий параметр `reverse` на `True`, як пояснюється нижче.
sorted_desserts = dict(sorted(desserts.items(), key=lambda item:item[1], reverse=True)) print(sorted_desserts) # Вивід {'Брауні': 12, 'Морозиво': 10, 'Рулет швейцарський': 5, 'Печиво': 4, 'Чізкейк': 3, 'Кекс': 2}
Тепер словник `sorted_desserts` відсортовано у порядку спадання цін, починаючи з найдорожчого десерту, “Брауні” за 12 доларів.
Підсумки 👩🏽💻
Давайте підсумуємо все, що ми розглянули у цьому посібнику.
- Словник Python зберігає дані у парах ключ-значення; всі ключі мають бути унікальними.
- Для сортування словника за ключем чи значенням ми створюємо новий словник, відсортований у потрібному порядку.
- Методи словника `.keys()` та `.items()` дозволяють отримати всі ключі та пари ключ-значення відповідно.
- Для досягнення потрібного сортування можна використовувати функцію `sorted()` разом із необов’язковими параметрами `key` та `reverse`.
Тепер, коли ви навчилися сортувати словники Python, ви можете вивчити сортування списків Python. Щасливого кодування! 🎉