Додаткові властивості словників у Python

Сьогодні ми поговоримо про деякі додаткові властивості словників, які надають бібліотеки bidict та frozendict. У цій статті ми розглянемо обидві бібліотеки та їх функції по черзі.

Встановлення bidict

Windows:

pip install bidict

MacOS:

pip3 install bidict

Linux:

pip install bidict

Встановлення frozendict

Windows:

pip install frozendict

MacOs:

pip3 install frozendict

Linux:

pip install frozendict

Застосування функцій bidict

Перша бібліотека — bidict, вона надає можливість отримувати ключ по значенню. Тобто, таким чином ми можемо керувати словником у дві сторони — отримувати значення за ключем та ключ за значенням.

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

import bidict

special_dict = bidict.bidict({"a": "artefact",
                              "b": "benevolence",
                              "c": "clergy"})

print(f"Value from a key: {special_dict['a']}\n"
      f"A key from a value: {special_dict.inverse['artefact']}\n"
      f"")

print(f"Value from a key: {special_dict['b']}\n"
      f"A key from a value: {special_dict.inverse['benevolence']}\n"
      f"")

print(f"Value from a key: {special_dict['c']}\n"
      f"A key from a value: {special_dict.inverse['clergy']}\n"
      f"")
Value from a key: artefact
A key from a value: a

Value from a key: benevolence
A key from a value: b

Value from a key: clergy
A key from a value: c

Як бачимо, ми можемо не тільки отримати значення за ключем, а й ключ за значенням. Тут за допомогою класу bidict() ми створюємо якраз такий двонапрямлений словник. Далі завдяки властивості inverse отримуємо ключ за значенням.

Способи створення замороженого словника

Бібліотека frozendict дозволяє нам створювати спеціальний словник, який не можна змінити. Його часто називають “замороженим“ через його незмінність.

Перед початком слід зазначити, що є два способи створення замороженого словника. Перший спосіб полягає у тому, що ми вводимо ключі як параметри у класі frozendict(), а значення словника записуємо безпосередньо як значення параметрів. Ось приклад першого способу:

frozen_dict = frozendict.frozendict(Italy="Milan", England="Arsenal", Spain="Real Madrid")

У другому способі просто записуємо звичайний словник у frozendict(). Ось приклад другого способу:

frozen_dict = frozendict.frozendict({"Italy": "Milan", "England": "Arsenal", "Spain": "Real Madrid"})

Ось таким чином можна створювати заморожений словник.

Порівняння звичайного та замороженого словників

Тепер розберемося як використовувати так званий “заморожений“ словник. Для цього спочатку наведемо приклад звичайного словника, а потім замороженого, щоб порівняти їх.

Ось звичайний словник та зміни у ньому:

simple_dict = {"Italy": "Milan", "England": "Arsenal", "Spain": "Real Madrid"}
print(f"Created dict: {simple_dict}")

simple_dict["England"] = "Chelsea"
print(f"Changed dict: {simple_dict}")
Created dict: {'Italy': 'Milan', 'England': 'Arsenal', 'Spain': 'Real Madrid'}
Changed dict: {'Italy': 'Milan', 'England': 'Chelsea', 'Spain': 'Real Madrid'}

Як бачимо, ми створили словник, а згодом змінили у ньому значення за допомогою ключа “England“ з “Arsenal“ на “Chelsea“.

Тепер створимо заморожений словник та зробимо те саме:

frozen_dict = frozendict.frozendict(Italy="Milan", England="Arsenal", Spain="Real Madrid")

print(f"Created dict: {frozen_dict}")

frozen_dict["England"] = ["Fulham"]
print(f"Changed dict: {frozen_dict}")
Created dict: frozendict.frozendict({'Italy': 'Milan', 'England': 'Arsenal', 'Spain': 'Real Madrid'})

TypeError: 'frozendict.frozendict' object does not support item assignment

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

Якщо ми захочемо, наприклад, видалити ключ зі словника — отримаємо ту ж саму помилку. Ось ще один приклад зі звичайним словником:

simple_dict = {"Italy": "Milan", "England": "Arsenal", "Spain": "Real Madrid"}
print(f"Created dict: {simple_dict}")

del simple_dict["Spain"]
print(f"Deleted key: {simple_dict}")
Created dict: {'Italy': 'Milan', 'England': 'Arsenal', 'Spain': 'Real Madrid'}
Deleted key: {'Italy': 'Milan', 'England': 'Arsenal'}

Теж саме тільки із замороженим словником:

frozen_dict = frozendict.frozendict(Italy="Milan", England="Arsenal", Spain="Real Madrid")

print(f"Created dict: {frozen_dict}")

del frozen_dict["Spain"]
print(f"Deleted key: {frozen_dict}")
Created dict: frozendict.frozendict({'Italy': 'Milan', 'England': 'Arsenal', 'Spain': 'Real Madrid'})

TypeError: 'frozendict.frozendict' object does not support item deletion

Як і казали раніше, отримали помилку TypeError.

“Видимість зміни” у заморожених словниках

На цьому етапі ми вже переконалися у тому, що заморожений словник є незмінним. Тепер розглянемо інші методи, які роблять “видимість зміни“. Насправді такі методи просто створюють новий об’єкт, але не змінюють вже існуючий.

Одним з таких методів є метод delete(). Даний метод наче “видяляє” ключ зі словника, але насправді він створює новий об’єкт, де вказаного у методі ключа вже немає.

Дивимося застосування методу на прикладі:

frozen_dict = frozendict.frozendict(Italy="Milan", England="Arsenal", Spain="Real Madrid")

print(f"Created dict: {frozen_dict}\n"
      f"")

print(f"Deleted key: {frozen_dict.delete('Italy')}\n"
      f"")

print(f"Dict: {frozen_dict}\n"
      f"")
Created dict: frozendict.frozendict({'Italy': 'Milan', 'England': 'Arsenal', 'Spain': 'Real Madrid'})

Deleted key: frozendict.frozendict({'England': 'Arsenal', 'Spain': 'Real Madrid'})

Dict: frozendict.frozendict({'Italy': 'Milan', 'England': 'Arsenal', 'Spain': 'Real Madrid'})

Тобто якраз на рядку frozen_dict.delete('Italy') метод створює новий об’єкт, у якому ключ ‘Italy‘ відсутній. А загалом, якщо ми знову виведемо словник після цього рядка, то він залишиться незмінним.

Висновок

У цьому матеріалі ми ознайомилися із бібліотеками bidict та frozendict. За допомогою bidict ми змогли отримати ключ за значенням, що у звичайному словнику зробити неможливо. А завдяки frozendict, ми отримали змогу створити словник, який неможливо змінити.

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Mystique Lord
Mystique Lord@nocturnal_reader

Нічний читач

60Прочитань
15Автори
3Читачі
На Друкарні з 14 липня

Більше від автора

Вам також сподобається

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Вам також сподобається