Python · Синтаксис · Початковий рівень
Методи словників
Освойте всі основні методи словників та dict comprehension для ефективної роботи з даними.
Короткий вступ до теми та пояснення перед вправами (вправи нижче):
Dict Comprehension та вкладені словники
#Довідник: методи словників
#Вправи:
Безпечне читання конфігурації
#Напишіть функцію `get_setting(config, key, default=None)`, яка безпечно читає значення зі словника конфігурації. Якщо ключ є — повертає значення, інакше — `default`. Приклад: `get_setting({"debug": True}, "debug")` → `True`, `get_setting({"debug": True}, "port", 8080)` → `8080`.
def get_setting(config, key, default=None):
pass
print(get_setting({"debug": True}, "debug")) # True
print(get_setting({"debug": True}, "port", 8080)) # 8080
print(get_setting({"debug": True}, "host")) # None
Рішення
def get_setting(config, key, default=None):
return config.get(key, default)
print(get_setting({"debug": True}, "debug")) # True
print(get_setting({"debug": True}, "port", 8080)) # 8080
print(get_setting({"debug": True}, "host")) # None
Частота слів
#Напишіть функцію `word_freq(text)`, яка повертає словник, де кожне слово відповідає кількості його входжень. Слова перекладаються у нижній регістр (для простоти вважайте, що слова розділені лише пробілами). Приклад: `word_freq("the cat sat the cat")` → `{"the": 2, "cat": 2, "sat": 1}`.
def word_freq(text):
pass
print(word_freq("the cat sat the cat"))
# {"the": 2, "cat": 2, "sat": 1}
Рішення
def word_freq(text):
counts = {}
for word in text.lower().split():
counts[word] = counts.get(word, 0) + 1
return counts
print(word_freq("the cat sat the cat"))
# {"the": 2, "cat": 2, "sat": 1}
Злиття з перевизначенням
#Напишіть функцію `merge(base, overrides)`, яка повертає новий словник з усіма ключами з `base`, але якщо ключ є у `overrides` — береться значення з `overrides`. Оригінальні словники не повинні змінюватись. Приклад: `merge({"a": 1, "b": 2}, {"b": 99, "c": 3})` → `{"a": 1, "b": 99, "c": 3}`.
def merge(base, overrides):
pass
print(merge({"a": 1, "b": 2}, {"b": 99, "c": 3}))
# {"a": 1, "b": 99, "c": 3}
Рішення
def merge(base, overrides):
return {**base, **overrides}
print(merge({"a": 1, "b": 2}, {"b": 99, "c": 3}))
# {"a": 1, "b": 99, "c": 3}
Безпечне видалення ключа
#Напишіть функцію `remove_key(d, key)`, яка видаляє `key` зі словника `d` якщо він існує, і повертає видалене значення. Якщо ключ не існує — повертає `None` без помилки. Функція має модифікувати `d` на місці. Приклад: `d = {"a": 1, "b": 2}; remove_key(d, "a")` → повертає `1`, `d` стає `{"b": 2}`.
def remove_key(d, key):
pass
d = {"a": 1, "b": 2}
print(remove_key(d, "a")) # 1
print(d) # {"b": 2}
print(remove_key(d, "x")) # None
Рішення
def remove_key(d, key):
return d.pop(key, None)
d = {"a": 1, "b": 2}
print(remove_key(d, "a")) # 1
print(d) # {"b": 2}
print(remove_key(d, "x")) # None
Словник квадратів
#Напишіть функцію `squares_dict(n)` з використанням dict comprehension, яка повертає словник, де ключі — цілі числа від 1 до `n`, а значення — їх квадрати. Приклад: `squares_dict(5)` → `{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}`.
def squares_dict(n):
pass
print(squares_dict(5))
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Рішення
def squares_dict(n):
return {i: i ** 2 for i in range(1, n + 1)}
print(squares_dict(5))
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Фільтрація за значенням
#Напишіть функцію `filter_dict(d, min_value)`, яка повертає новий словник, що містить тільки пари ключ-значення, де значення більше або рівне `min_value`. Приклад: `filter_dict({"a": 5, "b": 1, "c": 8, "d": 3}, 4)` → `{"a": 5, "c": 8}`.
def filter_dict(d, min_value):
pass
print(filter_dict({"a": 5, "b": 1, "c": 8, "d": 3}, 4))
# {"a": 5, "c": 8}
Рішення
def filter_dict(d, min_value):
return {k: v for k, v in d.items() if v >= min_value}
print(filter_dict({"a": 5, "b": 1, "c": 8, "d": 3}, 4))
# {"a": 5, "c": 8}
Інвертування словника
#Напишіть функцію `invert(d)`, яка міняє місцями ключі і значення словника і повертає новий інвертований словник. Вважайте, що всі значення унікальні та хешабельні. Приклад: `invert({"a": 1, "b": 2, "c": 3})` → `{1: "a", 2: "b", 3: "c"}`.
def invert(d):
pass
print(invert({"a": 1, "b": 2, "c": 3}))
# {1: "a", 2: "b", 3: "c"}
Рішення
def invert(d):
return {v: k for k, v in d.items()}
print(invert({"a": 1, "b": 2, "c": 3}))
# {1: "a", 2: "b", 3: "c"}
Групування за першою літерою
#Напишіть функцію `group_by_letter(words)`, яка повертає словник, де кожен ключ — це літера, а значення — відсортований список слів, що починаються з цієї літери. Приклад: `group_by_letter(["apple", "ant", "banana", "bear"])` → `{"a": ["ant", "apple"], "b": ["banana", "bear"]}`.
def group_by_letter(words):
pass
print(group_by_letter(["apple", "ant", "banana", "bear"]))
# {"a": ["ant", "apple"], "b": ["banana", "bear"]}
Рішення
def group_by_letter(words):
result = {}
for word in words:
key = word[0]
result.setdefault(key, []).append(word)
for key in result:
result[key].sort()
return result
print(group_by_letter(["apple", "ant", "banana", "bear"]))
# {"a": ["ant", "apple"], "b": ["banana", "bear"]}
Безпечний доступ до вкладених даних
#Напишіть функцію `deep_get(data, *keys)`, яка безпечно отримує значення з вкладених словників за ланцюжком ключів. Повертає `None` якщо будь-який ключ відсутній. Приклад: `deep_get({"user": {"address": {"city": "Kyiv"}}}, "user", "address", "city")` → `"Kyiv"`, `deep_get({"user": {}}, "user", "address", "city")` → `None`.
def deep_get(data, *keys):
pass
user = {"user": {"address": {"city": "Kyiv"}}}
print(deep_get(user, "user", "address", "city")) # Kyiv
print(deep_get(user, "user", "phone")) # None
Рішення
def deep_get(data, *keys):
for key in keys:
if not isinstance(data, dict):
return None
data = data.get(key)
return data
user = {"user": {"address": {"city": "Kyiv"}}}
print(deep_get(user, "user", "address", "city")) # Kyiv
print(deep_get(user, "user", "phone")) # None
Словник з двох списків
#Напишіть функцію `zip_to_dict(keys, values)`, яка створює словник з двох списків однакової довжини. Якщо довжини різні — кидає `ValueError` з повідомленням `"Lists must have the same length"`. Приклад: `zip_to_dict(["a", "b", "c"], [1, 2, 3])` → `{"a": 1, "b": 2, "c": 3}`.
def zip_to_dict(keys, values):
pass
print(zip_to_dict(["a", "b", "c"], [1, 2, 3]))
# {"a": 1, "b": 2, "c": 3}
zip_to_dict(["x", "y"], [1, 2, 3]) # raises ValueError
Рішення
def zip_to_dict(keys, values):
if len(keys) != len(values):
raise ValueError("Lists must have the same length")
return dict(zip(keys, values))
print(zip_to_dict(["a", "b", "c"], [1, 2, 3]))
# {"a": 1, "b": 2, "c": 3}
try:
zip_to_dict(["x", "y"], [1, 2, 3])
except ValueError as e:
print(e)