Всіх вітаю! У новій статті ми поговоримо про те, як можна орієнтуватися у словниках та знаходити потрібні нам дані у ньому дещо незвичайними шляхами. У цій статті ми оглянемо функціонал бібліотек python-box та dpath.
Бібліотека python-box — отримуємо значення у словниках через крапку
Встановалення python-box
Windows:
pip install python-boxMacOS:
pip3 install python-boxLinux:
pip install python-boxВикористання python-box
Спочатку імпортуємо бібліотеку:
import boxДля створення словника, в якому ми б могли отримувати значення ключів за допомгою крапки треба створити його у класі Box:
staff_info = box.Box({
"CEO": "Jerry Hill",
"Manager": "Todd Linton",
"Office worker": "Clay Johnson",
"Analyst": "Patricia Miller"
})Щоб отримати значенння ключів застосовуємо крапку, причому у місцях пробілу вставляємо нижче підкреслення:
print(f"CEO: {staff_info.CEO}\n"
f"Manager: {staff_info.Manager}\n"
f"Office worker: {staff_info.Office_worker}\n"
f"Analyst: {staff_info.Analyst}")Ось повний код:
import box
staff_info = box.Box({
"CEO": "Jerry Hill",
"Manager": "Todd Linton",
"Office worker": "Clay Johnson",
"Analyst": "Patricia Miller"
})
print(f"CEO: {staff_info.CEO}\n"
f"Manager: {staff_info.Manager}\n"
f"Office worker: {staff_info.Office_worker}\n"
f"Analyst: {staff_info.Analyst}")Результат:
CEO: Jerry Hill
Manager: Todd Linton
Office worker: Clay Johnson
Analytic: Patricia MillerТепер подивимося на інший приклад, де словник є більш глибшим:
staff_info = box.Box({
"CEO": {"name": "Jerry Hill", "age": 45, "experience": "12 years"},
"Manager": {"name": "Todd Linton", "age": 30, "experience": "7 years"},
"Office worker": {"name": "Clay Johnson", "age": 22, "experience": "2 years"},
"Analyst": {"name": "Patricia Miller", "age": 25, "experience": "5 years"}
})
print(f"CEO (name): {staff_info.CEO.name}\n"
f"Manager (name): {staff_info.Manager.name}\n"
f"Office worker (name): {staff_info.Office_worker.name}\n"
f"Analyst (name): {staff_info.Analyst.name}\n"
f"")
print(f"CEO (age): {staff_info.CEO.age}\n"
f"Manager (age): {staff_info.Manager.age}\n"
f"Office worker (age): {staff_info.Office_worker.age}\n"
f"Analyst (age): {staff_info.Analyst.age}\n"
f"")
print(f"CEO (experience): {staff_info.CEO.experience}\n"
f"Manager (experience): {staff_info.Manager.experience}\n"
f"Office worker (experience): {staff_info.Office_worker.experience}\n"
f"Analyst (experience): {staff_info.Analyst.experience}")Тут по суті все так само, тільки словник став глибшим і ми отримуємо більше інформації зі словника.
Результат:
CEO (name): Jerry Hill
Manager (name): Todd Linton
Office worker (name): Clay Johnson
Analyst (name): Patricia Miller
CEO (age): 45
Manager (age): 30
Office worker (age): 22
Analyst (age): 25
CEO (experience): 12 years
Manager (experience): 7 years
Office worker (experience): 2 years
Analyst (experience): 5 yearsТаким чином ми можемо отримувати дані зі словника за допомгою крапки — це банально легше. А ось як виглядав би звичний спосіб отримання значень зі словника:
staff_info = {
"CEO": {"name": "Jerry Hill", "age": 45, "experience": "12 years"},
"Manager": {"name": "Todd Linton", "age": 30, "experience": "7 years"},
"Office worker": {"name": "Clay Johnson", "age": 22, "experience": "2 years"},
"Analyst": {"name": "Patricia Miller", "age": 25, "experience": "5 years"}
}
print(f"CEO (name): {staff_info['CEO']['name']}\n"
f"Manager (name): {staff_info['Manager']['name']}\n"
f"Office worker (name): {staff_info['Office worker']['name']}\n"
f"Analyst (name): {staff_info['Analyst']['name']}\n"
f"")
print(f"CEO (age): {staff_info['CEO']['age']}\n"
f"Manager (age): {staff_info['Manager']['age']}\n"
f"Office worker (age): {staff_info['Office worker']['age']}\n"
f"Analyst (age): {staff_info['Analyst']['age']}\n"
f"")
print(f"CEO (experience): {staff_info['CEO']['experience']}\n"
f"Manager (experience): {staff_info['Manager']['experience']}\n"
f"Office worker (experience): {staff_info['Office worker']['experience']}\n"
f"Analyst (experience): {staff_info['Analyst']['experience']}")CEO (name): Jerry Hill
Manager (name): Todd Linton
Office worker (name): Clay Johnson
Analyst (name): Patricia Miller
CEO (age): 45
Manager (age): 30
Office worker (age): 22
Analyst (age): 25
CEO (experience): 12 years
Manager (experience): 7 years
Office worker (experience): 2 years
Analyst (experience): 5 yearsА тепер пропоную перейти до іншого способу орієнтації у словнику.
Бібліотека dpath — орієнтуємося у словниках як у файловій системі
Встановлення dpath
Windows:
pip install dpathMacOS:
pip3 install dpathLinux:
pip install dpathФункція get() для отримання значень зі словника
Бібліотека dpath дозволяє отримувати значення зі словників так, наче ми вказуємо місце знаходження файлів у файловій системі. Тобто замість крапки, як у минулому прикладі, ми використовуємо слеш (“/“).
Як завжди почнемо своє ознайомлення із бібліотекою з імпортування її у проєкт:
import dpathТепер беремо поперній словник і намагаємося знайти ім’я людей на посадах. Це ми будемо робити за допомогою функції get().
Приклад:
staff_info = {
"CEO": "Jerry Hill",
"Manager": "Todd Linton",
"Office worker": "Clay Johnson",
"Analyst": "Patricia Miller"
}
print(f"CEO (name): {dpath.get(staff_info, '/CEO')}\n"
f"Manager (name): {dpath.get(staff_info, '/Manager')}\n"
f"Office worker (name): {dpath.get(staff_info, '/Office worker')}\n"
f"Analyst (name): {dpath.get(staff_info, '/Analyst')}\n"
f"")CEO (name): Jerry Hill
Manager (name): Todd Linton
Office worker (name): Clay Johnson
Analyst (name): Patricia MillerЯк бачимо, такий підхіх також працює. Тепер пропоную поглянути на роботу функції get() у контексті оновленого словника staff_info.
Ще один приклад:
staff_info = {
"CEO": {"name": "Jerry Hill",
"age": 45,
"experience": "12 years"},
"Manager": {"name": "Todd Linton",
"age": 30,
"experience": "7 years"},
"Office worker": {"name": "Clay Johnson",
"age": 22,
"experience": "2 years"},
"Analyst": {"name": "Patricia Miller",
"age": 25,
"experience": "5 years"}
}
print(f"CEO (name): {dpath.get(staff_info, '/CEO/name')}\n"
f"Manager (name): {dpath.get(staff_info, '/Manager/name')}\n"
f"Office worker (name): {dpath.get(staff_info, '/Office worker/name')}\n"
f"Analyst (name): {dpath.get(staff_info, '/Analyst/name')}\n"
f"")
print(f"CEO (age): {dpath.get(staff_info, '/CEO/age')}\n"
f"Manager (age): {dpath.get(staff_info, '/Manager/age')}\n"
f"Office worker (age): {dpath.get(staff_info, '/Office worker/age')}\n"
f"Analyst (age): {dpath.get(staff_info, '/Analyst/age')}\n"
f"")
print(f"CEO (experience): {dpath.get(staff_info, '/CEO/experience')}\n"
f"Manager (experience): {dpath.get(staff_info, '/Manager/experience')}\n"
f"Office worker (experience): {dpath.get(staff_info, '/Office worker/experience')}\n"
f"Analyst (experience): {dpath.get(staff_info, '/Analyst/experience')}\n"
f"")CEO (name): Jerry Hill
Manager (name): Todd Linton
Office worker (name): Clay Johnson
Analyst (name): Patricia Miller
CEO (age): 45
Manager (age): 30
Office worker (age): 22
Analyst (age): 25
CEO (experience): 12 years
Manager (experience): 7 years
Office worker (experience): 2 years
Analyst (experience): 5 yearsФункція search() для пошуку значень у словнику
За допомгою функції search() ми маємо змогу здійснити пошук конкретних значень у словнику. Вона у якості результату показує повний шлях, за яким він знайшов потірбні значення і самі знайдені значення.
До прикладу, якщо ми хочемо знайти усі значення, що зберігаються у ключі, то у кінці треба зазначити зірку (“*“). Наприклад, у нас в словнику є ключ, який має у собі ще один словник з двома іншими ключами та значеннями і ми хочемо вивести усе, що відповідає першому ключу.
Отже, оновимо наш словник, додавши ключ “hobbies“ з вкладеним у нього словником:
staff_info = {
"CEO": {"name": "Jerry Hill",
"age": 45,
"experience": "12 years",
"hobbies": {"old": ["Math", "Physics", "Astronomy"],
"new": ["Chess", "Checkers", "Tetris"]
}},
"Manager": {"name": "Todd Linton",
"age": 30,
"experience": "7 years",
"hobbies": {"old": ["Football", "Cricket"],
"new": ["Basketball", "Tennis"]
}},
"Office worker": {"name": "Clay Johnson",
"age": 22,
"experience": "2 years",
"hobbies": {"old": ["Theatre", "Reading"],
"new": ["Linguistics", "History"]
}},
"Analyst": {"name": "Patricia Miller",
"age": 25,
"experience": "5 years",
"hobbies": {"old": ["Statistics", "Geography"],
"new": ["Drawing", "Films"]
}}
}Тепер ми маємо ключ hobbies, який містить у собі словник із двома іншими ключами, котрі мають списки як значення. Спробуємо відшукати значення і ключа old, і ключа new. Але для цього ми використовуємо вже функцію search(), яка саме шукає значення, адже get() не підтримує такий функціонал.
Задля цього у шляху до цих значень пишемо наступне:
dpath.search(staff_info, "/CEO/hobbies/*")Тобто ми переходимо до ключа hobbies і беремо усе, що є всередині нього. Ми позначаємо бажання взяти усе з ключа зірочкою у кінці.
Ось приклад:
print(f"CEO (hobbies):\n"
f"{dpath.search(staff_info, '/CEO/hobbies/*')}\n"
f"Manager (hobbies):\n"
f"{dpath.search(staff_info, '/Manager/hobbies/*')}\n"
f"Office worker (hobbies):\n"
f"{dpath.search(staff_info, '/Office worker/hobbies/*')}\n"
f"Analyst (hobbies):\n"
f"{dpath.search(staff_info, '/Analyst/hobbies/*')}\n"
f"")CEO (hobbies):
{'CEO': {'hobbies': {'old': ['Math', 'Physics', 'Astronomy'], 'new': ['Chess', 'Checkers', 'Tetris']}}}
Manager (hobbies):
{'Manager': {'hobbies': {'old': ['Football', 'Cricket'], 'new': ['Basketball', 'Tennis']}}}
Office worker (hobbies):
{'Office worker': {'hobbies': {'old': ['Theatre', 'Reading'], 'new': ['Linguistics', 'History']}}}
Analyst (hobbies):
{'Analyst': {'hobbies': {'old': ['Statistics', 'Geography'], 'new': ['Drawing', 'Films']}}}Як бачимо, ми отримали весь словник, що зберагіється у ключі hobbies.
Висновок
У рамках даної статті ми розглянули одразу дві бібліотеки та їхні підходи до роботи зі словниками. Тепер ми можемо отримувати значення через крапку або слеш. Це дещо простіше у написанні та дозволяє мати деякі додаткові функції, наприклад, функція search() у бібліотеці dpath.