Друкарня від 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.

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

  • Вітаємо з Різдвом Христовим!

    Друкарня та платформа WE.UA вітають всіх наших читачів та авторів зі світлим святом Різдва! Зичимо всім українцям довгожданого миру, міцного здоровʼя, злагоди, родинного затишку та втілення всього доброго і прекрасного, чого вам побажали колядники!

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

    Різдво
  • Каблучки – прикраси, які варто купувати

    Ювелірні вироби – це не тільки спосіб витратити гроші, але і зробити вигідні інвестиції. Бо вартість ювелірних виробів з кожним роком тільки зростає. Тому купуючи стильні прикраси, ви вигідно вкладаєте кошти.

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

    Як Вибрати Каблучку
  • П'ять помилок у виборі домашнього текстилю, які псують комфорт сну

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

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

    Домашній Текстиль
  • Як знайти житло в Києві

    Переїжджаєте до Києва і шукаєте житло? Дізнайтеся, як орендувати чи купити квартиру, перевірити власника та знайти варіанти, про які зазвичай не говорять.

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

    Агентство Нерухомості
  • Як заохотити дитину до читання?

    Як залучити до читання сучасну молодь - поради та факти. Користь читання для дітей - основні переваги. Розвиток дітей - це наше майбутнє.

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

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

Нічний читач

419Прочитань
21Автори
11Читачі
Підтримати
На Друкарні з 14 липня

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

  • Tqdm — просте й швидке створення прогрес барів у консолі

    Всіх вітаю! Чи цікавилися ви коли небудь як створювати прогрес бари прямо у консолі? Якщо ні, то дана стаття саме для вас! У цій невеличкій статті ми дізнаємося, яким чином можна сторювати прогрес бари за допомогою бібліотеки tqdm у Python.

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

    Програмування
  • Добуток Кронекера у Python

    Всіх вітаю! У сьогоднішній статті ми поговоримо про те, як реалізувати добуток Кронекера у Python завдяки бібліотеці numpy. У рамках цієї статті ми розглянемо як використовувати функцію kron() та у чому суть добутку Кронекера.

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

    Програмування
  • Перетворення формул у Python на LaTeX формат

    Всіх вітаю! У цій статті ми розглянемо можливість перетворення формул у Python на LaTeX формат за допомогою бібліотеки latexify-py. Також ми перейдемо до середовищ розробки Google Colab та Jupyter Notebook для повноціннох роботи з цією бібліотекою.

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

    Програмування

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

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

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

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