Сьогодні ми поговоримо про деякі додаткові властивості словників, які надають бібліотеки 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
, ми отримали змогу створити словник, який неможливо змінити.