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

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

Зміст

Всіх вітаю! У третій частині додаткових властивостей словників у Python ми поговоримо про бібліотеку funcy, яка має немало цікавих функцій для роботи зі словниками.

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

Windows:

pip install funcy

MacOS:

pip3 install funcy

Linux:

pip install funcy

Функція walk() для застосування функції до кожного елемента

Функція walk()

Функція walk() приймає функцію, яку ми хочемо застосувати до елементів словника та сам словник. Її суть схожа на вбудовану функцію map(), яка виконує той самий функіонал, але без зміни типу даних. Тобто, якщо функція map() у результаті повертає нам об’єкт типу map, то walk() залишає тип даних об’єкта без змін.

Тепер перейдемо до коду, для початку імпортувавши бібліотеку:

import funcy

Створюємо словник:

store_prices = {"Milk": "60$",
                "Yogurt": "55$",
                "Chocolate bar": "20$"}

Тепер викликаємо функцію walk() і використовуємо її, передавши потрібні параметри:

reversed_dict = funcy.walk(reversed, store_prices)
print(reversed_dict)

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

Ось повний код першого нашого прикладу:

import funcy

store_prices = {"Milk": "60$",
                "Yogurt": "55$",
                "Chocolate bar": "20$"}

reversed_dict = funcy.walk(reversed, store_prices)
print(reversed_dict)
{'60$': 'Milk', '55$': 'Yogurt', '20$': 'Chocolate bar'}

Функція walk_values()

Тепер розглянемо наступний приклад, де ми вже напишемо функцію, яка б змінювала знак долара біля цін на “UAH” — скорочене позначення української гривні.

import funcy

store_prices = {"Milk": "60$",
                "Yogurt": "55$",
                "Chocolate bar": "20$"}


def currency_changer(value):
    new_currency = value.replace("$", " UAH")
    return new_currency

Отже, ми створили функцію currency_changer() для зміни валюти у цінах в словнику. У тілі даної функції ми просто замінюємо знак долара на UAH за допомогою функції replace() та повертаємо результат.

Також слід звернути увагу на те, що ми викоритовуємо функцію walk_values(), яка працює так само як і walk(), але застосовує передану фукнцію тільки для значень словника. Це фінальний рядок прорами:

modified_dict = funcy.walk_values(currency_changer, store_prices)
print(modified_dict)

Таким чином, ми написали функцію, котра змінює валюту у значеннях словника. Останній рядок з виводом результату ми додали чисто для відладки.

Ось повний код:

import funcy

store_prices = {"Milk": "60$",
                "Yogurt": "55$",
                "Chocolate bar": "20$"}


def currency_changer(value):
    new_currency = value.replace("$", " UAH")
    return new_currency


modified_dict = funcy.walk_values(currency_changer(), store_prices)
print(modified_dict)
{'Milk': '60 UAH', 'Yogurt': '55 UAH', 'Chocolate bar': '20 UAH'}

Ось так працює наша функція.

Функція walk_keys()

Крім функції walk_values(), є також і функція walk_keys(), яка застосовує передану функцію тільки для ключів словника. Давайте створимо іншу функцію, яка буде змінювати саме ключі словника.

Отже, тепер ми створимо функцію, яка буде позначати, чи є товар у наявності. Спочатку імпортуємо модуль random:

import random

Далі створюємо саму функцію, де оголошуємо список status_list з написами доступно (available) та недоступно (unavailable):

def set_available_label():
    status_list = ["available", "unavailable"]

Додаємо до назви продукта його статус, який ми обираємо випадково зі списку:

product_status = key + f" ({random.choice(status_list)})"

Повертаємо назву продукта з його статусом:

return product_status

Тепер використовуємо функцію walk_keys() та передаємо йому нову функцію з тим самим словником:

modified_dict = funcy.walk_keys(set_available_label, store_prices)
print(modified_dict)

Ось повний код:

import funcy
import random

store_prices = {"Milk": "60$",
                "Yogurt": "55$",
                "Chocolate bar": "20$"}


def set_available_label(key):
    status_list = ["available", "unavailable"]

    product_status = key + f" ({random.choice(status_list)})"
    return product_status
        
        
modified_dict = funcy.walk_keys(set_available_label, store_prices)
print(modified_dict)
{'Milk (unavailable)': '60$', 'Yogurt (available)': '55$', 'Chocolate bar (unavailable)': '20$'}

От і отримали очікуваний результат.

Функція merge() для об’єднання словників

Об’єднуємо два словники в один

Якщо ми хочемо об’єднати два або більше словники в один, тоді ми цілком можете використати функцію merge(), яка приймає потрібну кількість словників і об’єднує їх:

import funcy

store_prices = {"Milk": "60$",
                "Yogurt": "55$",
                "Chocolate bar": "20$"}

store_prices_2 = {"Cornflakes": "30$",
                  "Meat": "70$",
                  "Salad": "25$"}

united_dict = funcy.merge(store_prices, store_prices_2)
print(united_dict)
{'Milk': '60$', 'Yogurt': '55$', 'Chocolate bar': '20$', 'Cornflakes': '30$', 'Meat': '70$', 'Salad': '25$'}

Об’єднуємо більше двох словників в один

Також варто звернути увагу на те, що дана функція приймати більше двох словників і об’єднувати їх:

import funcy

store_prices = {"Milk": "60$",
                "Yogurt": "55$",
                "Chocolate bar": "20$"}

store_prices_2 = {"Cornflakes": "30$",
                  "Meat": "70$",
                  "Salad": "25$"}

store_prices_3 = {"Honey": "40$",
                  "Sweets": "53$",
                  "Cake": "45$"}

united_dict = funcy.merge(store_prices, store_prices_2, store_prices_3)
print(united_dict)
{'Milk': '60$', 'Yogurt': '55$', 'Chocolate bar': '20$', 'Cornflakes': '30$', 'Meat': '70$', 'Salad': '25$', 'Honey': '40$', 'Sweets': '53$', 'Cake': '45$'}

Ось так працює функція merge().

Функція select() для фільтрації вмісту словника

Функція select()

Функція select() потрібна для фільтрації словника. Вона приймає так звану умову фільтрації та сам словник у якості параметрів і фільтрує словник відповідно до умови.

Пропоную відфільтрувати словник так, щоб там залишилися тільки продукти, що є в наявності та ціна яких більша за 50.

Отже, створюємо функцію, що буде фільтрувати наш словник:

def available_over_fifty(item):
    key, value = item
    return "unavailable" not in key and value > 50

У цій функццї ми прирівнюємо змінні key та value до однієї змінної — item. Ця змінна означає елемент словника, котрий складається з ключа (key) та значення (value), які ми будемо фільтрувати. Далі ми повертаємо елемент, який підходить під наші умови. Тобто, щоб він був у наявності ("unavailable" not in key) та ціною вище за 50 (value > 50).

Також треба звернути увагу, що під час стоворення функцій для всіх представлених тут інструментів бібліотеки funcy потрібно вказувати один параметр. Цей параметр залежить від частити словника, який ви змінюєте у функції. Себто, якщо ви змінюєте тільки значення, то параметр означає значення словника, якщо тільки ключі — ключі словника. Якщо ж ви змінюєте і те, і інше, то має місце записати параметр item як у функції available_over_fifty().

У фінальному рядку ми викликаємо функцію select() і фільтруємо словник відповідно до умов у щойноствореній функції:

import random
import funcy

store_prices = {"Milk": 60,
                "Yogurt": 55,
                "Chocolate bar": 20}


def set_available_label(key):
    status_list = ["available", "unavailable"]

    product_status = key + f" ({random.choice(status_list)})"
    return product_status


modified_dict = funcy.walk_keys(set_available_label, store_prices)


def available_over_fifty(item):
    key, value = item
    return "unavailable" not in key and value > 50


available_price_over_fifty = funcy.select(available_over_fifty, modified_dict)
print(available_price_over_fifty)
{'Milk (available)': 60, 'Yogurt (available)': 55}

Надалі ми розіб’ємо умови на дві інші функції, щоб такі функції як select_keys() та select_values().

Функція select_values()

Тепер пропоную дещо змінити наш словник так, щоб значення у ньому були цілими числами, а не рядками:

store_prices = {"Milk": 60,
                "Yogurt": 55,
                "Chocolate bar": 20}

Тепер давайте напишемо функцію, яка б фільтрувала список так, щоб там залишалися тільки значення, що більші за 50:

def price_filter(value):
    return value > 50

Просто повертаємо тільки ті значення value, що більші за 50. Ось така коротка функція виходить. Далі використовуємо функцію select_values(), яка фільтрує тільки значення у словнику.

Ось фінальний рядок:

price_over_fifty = funcy.select_values(price_filter, store_prices)
print(price_over_fifty)

Ось повний код:

import funcy

store_prices = {"Milk": 60,
                "Yogurt": 55,
                "Chocolate bar": 20}


def price_filter(value):
    return value > 50


price_over_fifty = funcy.select_values(price_filter, store_prices)
print(price_over_fifty)
{'Milk': 60, 'Yogurt': 55}

Функція select_keys()

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

Ось приклад реалізації такої функції:

import random
import funcy

store_prices = {"Milk": 60,
                "Yogurt": 55,
                "Chocolate bar": 20}


def set_available_label(key):
    status_list = ["available", "unavailable"]

    product_status = key + f" ({random.choice(status_list)})"
    return product_status


modified_dict = funcy.walk_keys(set_available_label, store_prices)


def remove_unavailable(key):
    return "unavailable" not in key


available_only = funcy.select_keys(remove_unavailable, modified_dict)
print(available_only)
{'Yogurt (available)': '55$'}

Так як написи з’являються випадково, то результат кожен раз буде різним.

Висновок

Отже, у даній статті ми продовжили тему додаткових властивостей словника і познайомилися з немалою кількістю функцій з бібліотеки funcy. Взагалі дана бібліотека також може праюцювати і зі списками, і з кортежами, але у рамках статті ми розглянули тільки роботу зі словниками. Дякую за увагу!

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

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

Нічний читач

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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