Всіх вітаю! У третій частині додаткових властивостей словників у Python ми поговоримо про бібліотеку funcy, яка має немало цікавих функцій для роботи зі словниками.
Встановлення
Windows:
pip install funcyMacOS:
pip3 install funcyLinux:
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. Взагалі дана бібліотека також може праюцювати і зі списками, і з кортежами, але у рамках статті ми розглянули тільки роботу зі словниками. Дякую за увагу!