Python · Синтаксис · Початковий рівень

set, dict та обробка помилок

15 завдань

Практика Python з set, словниками та обробкою помилок: унікальні значення, загальні символи, try/except, безпечна обробка даних, угруповання слів та аналіз строк.

Множини — унікальність і множинні операції

#
Множина — це колекція унікальних значень без гарантованого порядку. Визначальна властивість — унікальність: додавання одного й того самого значення двічі не має жодного ефекту. ```python numbers = [1, 2, 2, 3, 3, 3] unique = set(numbers) print(unique) # {1, 2, 3} ``` Перевірка входження за допомогою in на множині набагато швидша, ніж на списку, особливо для великих колекцій. Це важливо, коли перевіряєте тисячі елементів. Множини підтримують математичні операції: ```python a = {1, 2, 3, 4} b = {3, 4, 5, 6} print(a & b) # {3, 4} — перетин: елементи, що є в обох print(a | b) # {1,2,3,4,5,6} — об'єднання: елементи з будь-якої print(a - b) # {1, 2} — різниця: є в a, але не в b ``` Пошук спільних символів між двома рядками: ```python def common_chars(a, b): return set(a) & set(b) ``` set("hello") дає {"h", "e", "l", "o"} — унікальні символи. Оператор & потім дає символи, що є в обох рядках. Коли використовувати множину замість списку: коли потрібна унікальність, швидка перевірка входження або множинні операції. Коли важливий порядок або потрібні дублікати — залишайтеся зі списком.

Патерни словників — групування і фільтрація

#
Словники організовують дані за ключем, а не за позицією. Ви вже використовували їх у завданнях з ООП — тут завдання працюють зі словниками безпосередньо як із вхідними і вихідними даними функцій. Групування елементів за властивістю — будуємо словник, де ключ — це група, а значення — список або лічильник: ```python def first_letter_stats(words): result = {} for word in words: letter = word[0] if letter not in result: result[letter] = [] result[letter].append(word) return result ``` Фільтрація словника — будуємо новий словник тільки з елементами, що проходять умову: ```python def adults_only(data): return {name: age for name, age in data.items() if age > 18} ``` dict.items() дає пари (ключ, значення). Словникове включення {k: v for k, v in ...} — це еквівалент спискового включення для словників. Обмін ключів і значень — працює, тільки якщо значення унікальні: ```python def swap_dict(d): return {v: k for k, v in d.items()} ``` Видалення None-значень зі словника: ```python def remove_none(d): return {k: v for k, v in d.items() if v is not None} ``` Використовуйте is not None замість != None. is перевіряє ідентичність, а не рівність — None є синглтоном, тому is — правильне порівняння.

Обробка помилок за допомогою try/except

#
Винятки — це спосіб Python сигналізувати про те, що щось пішло не так під час виконання. int("hello") викидає ValueError. Ділення на нуль — ZeroDivisionError. Доступ до відсутнього ключа — KeyError. Без обробки — програма падає. try/except дозволяє реагувати на виняток замість падіння: ```python def safe_sum(text): total = 0 for part in text.split(): try: total += int(part) except ValueError: pass # пропускаємо частини, що не є числами return total ``` Блок try містить код, який може зазнати невдачі. Якщо виникає виняток вказаного типу — виконання переходить до блоку except. Якщо винятку не виникло — блок except повністю пропускається. Завжди вказуйте конкретний тип винятку замість голого except. Голий except перехоплює все — включаючи переривання клавіатурою і виходи з системи — що ускладнює зупинку програм і приховує справжні помилки. Поширений патерн: спробувати перетворити ввід, за невдачі повернутись до значення за замовчуванням: ```python try: value = int(input("Введіть число: ")) except ValueError: value = 0 print("Не є числом, використовуємо 0") ``` Використовуйте try/except для ситуацій, що є справді виключними — некоректний ввід користувача, відсутні файли, таймаути мережі. Не використовуйте його замість перевірки умов, які можна перевірити безпосередньо (наприклад len(text) == 0 перед доступом до text[0]).

Швидкий довідник: множини, словники та винятки

#
**Операції з множиною** ```python s = {1, 2, 3} # літерал s = set([1, 2, 2, 3]) # зі списку — дублікати видаляються s.add(4) # додати один елемент s.discard(4) # видалити — мовчки якщо відсутній 4 in s # перевірка членства — O(1) a & b # перетин — елементи в обох a | b # об'єднання — елементи в будь-якій a - b # різниця — в a але не в b a ^ b # симетрична різниця — в одній але не в обох ``` **Швидкий довідник словника** ```python d.get(ключ, за_замовч) # безпечне отримання, без KeyError d.setdefault(ключ, []) # встановити якщо відсутній, повернути значення d.items() # пари (ключ, значення) d.keys() / d.values() # тільки ключі або значення # Словниковий вираз {k: v for k, v in d.items() if умова} ``` **Поширені винятки** | Виняток | Виникає коли… | |---|---| | `ValueError` | правильний тип, невірне значення: `int('abc')` | | `TypeError` | неправильний тип: `'a' + 1` | | `KeyError` | ключ словника не знайдено: `d['відсутній']` | | `IndexError` | індекс списку поза діапазоном: `[][0]` | | `ZeroDivisionError` | ділення на нуль: `1 / 0` | | `AttributeError` | немає такого атрибута/методу: `None.strip()` | | `FileNotFoundError` | файл не існує | **try / except / else / finally** ```python try: value = int(input('Число: ')) except ValueError: value = 0 # виконується лише коли ValueError except (KeyError, IndexError): value = -1 # перехопити кілька типів одразу else: print('Успіх!') # виконується лише коли НЕ MA виняток finally: print('Завжди') # очищення — виконується завжди # Перехопити та перевірити об'єкт винятку: except ValueError as e: print(f'Помилка: {e}') # Генерувати власний виняток: raise ValueError('має бути додатнім') ```
01

Унікальні додатні значення.

#

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

def unique_positive(nums):
    pass
Рішення
def unique_positive(nums):
    result = set()
    for n in nums:
        if n > 0:
            result.add(n)
    return result
02

Спільні символи двох рядків.

#

Напишіть функцію, яка приймає два рядки та повертає множину спільних символів.

def common_chars(a, b):
    pass
Рішення
def common_chars(a, b):
    return set(a) & set(b)
03

Середня ціна товарів.

#

Напишіть функцію, яка приймає словник з цінами товарів та повертає середню ціну. Якщо словник порожній — повернути 0.

def average_price(prices):
    pass
Рішення
def average_price(prices):
    if not prices:
        return 0
    total = 0
    for p in prices.values():
        total += p
    return total / len(prices)
04

Сума чисел із рядка.

#

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

def safe_sum(text):
    pass
Рішення
def safe_sum(text):
    total = 0
    for part in text.split():
        try:
            total += int(part)
        except ValueError:
            pass
    return total
05

Групування за першою буквою.

#

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

def first_letter_stats(words):
    pass
Рішення
def first_letter_stats(words):
    result = {}
    for w in words:
        if not w:
            continue
        key = w[0]
        if key in result:
            result[key] += 1
        else:
            result[key] = 1
    return result

# або так можна через setdefault
words = ["apple", "ant", "banana", "book"]
result = {}

for word in words:
    first = word[0]
    result.setdefault(first, []).append(word)

print(result)
06

Перетин і різниця множин.

#

Напишіть функцію, яка приймає дві множини та повертає: - їх перетин - їх різницю (перша мінус друга)

def set_operations(a, b):
    pass
Рішення
def set_operations(a, b):
    return {
        "intersection": a & b,
        "difference": a - b
    }
07

Фільтр старше 18.

#

Напишіть функцію, яка приймає словник {ім’я: вік} та повертає словник лише з тими, хто старший за 18.

def adults_only(data):
    pass
Рішення
def adults_only(data):
    result = {}
    for name, age in data.items():
        if age > 18:
            result[name] = age
    return result
08

Множина типів значень.

#

Напишіть функцію, яка приймає список значень та повертає множину їх типів.

def value_types(values):
    pass
Рішення
def value_types(values):
    result = set()
    for v in values:
        result.add(type(v))
    return result
09

Найкращий учень за балами.

#

Напишіть функцію, яка приймає словник з балами учнів та повертає ім’я учня з максимальним балом. Якщо словник порожній — повернути None .

def best_student(scores):
    pass
Рішення
def best_student(scores):
    if not scores:
        return None
    best = None
    max_score = -1
    for name, score in scores.items():
        if score > max_score:
            max_score = score
            best = name
    return best
10

Підрахунок слів.

#

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

def word_frequency(text):
    pass
Рішення
def word_frequency(text):
    result = {}
    for w in text.split():
        w = w.lower()
        if w in result:
            result[w] += 1
        else:
            result[w] = 1
    return result
11

Парні та непарні у словнику.

#

Напишіть функцію, яка приймає список чисел та повертає словник: - "even" — кількість парних - "odd" — кількість непарних

def even_odd_stats(nums):
    pass
Рішення
def even_odd_stats(nums):
    result = {"even": 0, "odd": 0}
    for n in nums:
        if n % 2 == 0:
            result["even"] += 1
        else:
            result["odd"] += 1
    return result
12

Видалення значень None.

#

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

def remove_none(d):
    pass
Рішення
def remove_none(d):
    result = {}
    for k, v in d.items():
        if v is not None:
            result[k] = v
    return result
13

Унікальні слова з рядків.

#

Напишіть функцію, яка приймає список рядків та повертає множину всіх унікальних слів.

def unique_words(lines):
    pass
Рішення
def unique_words(lines):
    result = set()
    for line in lines:
        for w in line.split():
            result.add(w.lower())
    return result
14

Цифри, літери та інші символи.

#

Напишіть функцію, яка приймає рядок та повертає словник: - "digits" — кількість цифр - "letters" — кількість літер - "others" — кількість інших символів

def char_stats(text):
    pass
Рішення
def char_stats(text):
    result = {"digits": 0, "letters": 0, "others": 0}
    for ch in text:
        if ch.isdigit():
            result["digits"] += 1
        elif ch.isalpha():
            result["letters"] += 1
        else:
            result["others"] += 1
    return result
15

Множини слів за довжиною.

#

Напишіть функцію, яка приймає список слів та повертає словник, де: - ключ — довжина слова - значення — множина слів такої довжини

def group_by_length(words):
    pass
Рішення
def group_by_length(words):
    result = {}
    for w in words:
        l = len(w)
        if l not in result:
            result[l] = set()
        result[l].add(w)
    return result