Друкарня від WE.UA

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

Зміст

Всіх вітаю! У новій статті ми поговоримо про те, як можна орієнтуватися у словниках та знаходити потрібні нам дані у них дещо незвичайними шляхами. У цій статті ми оглянемо функціонал бібліотек python-box та dpath.

Бібліотека python-box — отримуємо значення у словниках через крапку

Встановалення python-box

Windows:

pip install python-box

MacOS:

pip3 install python-box

Linux:

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 dpath

MacOS:

pip3 install dpath

Linux:

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.

Статті про вітчизняний бізнес та цікавих людей:

  • Як модні бренди формують культуру та впливають на глобальні fashion-тренди

    Модні бренди часто стають символами ідентичності. Вони впливають на вибір способу життя не тільки в одязі — розкішні годинники, парфуми, товари для дому та враження підкріплюють культурні наративи успіху, смаку та вишуканості.

    Теми цього довгочиту:

    Мода
  • Створити блог на Друкарні - швидко, легко та безкоштовно

    Друкарня - це зручне та безкоштовне середовище для ведення власного блогу. В даній статті ми розповідаємо про основні переваги та функціональні можливості для того, щоб зацікавити нових авторів створити власний блог на Друкарні. Будь ласка, поширте цю інформацію.

    Теми цього довгочиту:

    Друкарня
  • Чому Google Merchant Center може заблокувати обліковий запис?

    Одним з найбільш ефективних каналів продажів є система Google Merchant Center. Правда, акаунт в ній може бути несподівано заблокований, якщо при його налаштуванні були порушені правила системи. У статті розглянемо підводні камені і дамо відповідь як уникнути блокування

    Теми цього довгочиту:

    Google Merchant Center
  • Бухгалтерський супровід ФОП: сучасний підхід до обліку

    Завдяки розвитку інформаційних технологій, впровадженню сучасних рішень і сервісів процес ведення бухобліку бізнесу став значно простішим і зручним. З іншого боку, ті ж технології додали бухгалтерам роботи – з обліком онлайн-продажів і надходжень у валюті, CRM-системами та ін.

    Теми цього довгочиту:

    Бухгалтерський Облік Фоп
  • Пилосос як базова техніка для щоденного прибирання

    Підтримання чистоти в оселі потребує зручних і продуманих рішень, особливо коли йдеться про догляд за різними поверхнями. У домашньому побуті пилосос залишається базовою побутовою технікою, що поєднує сухе та вологе очищення без зайвих зусиль.

    Теми цього довгочиту:

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

Нічний читач

48Довгочити
526Прочитання
15Підписники
Підтримати
На Друкарні з 14 липня

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

Це також може зацікавити:

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

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

Це також може зацікавити: