Python · Синтаксис · Начальный уровень

Множества, словари, обработка ошибок

15 задач

Практика Python с множествами, словарями и обработкой ошибок: уникальные значения, общие символы, 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['missing']` | | `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('Успех!') # выполняется только когда НЕТ исключения 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