✅ Решения

⚡ Кратко: что важно

Урок повторяет модули time и collections (OrderedDict, Counter, deque, defaultdict), frozenset, functools.lru_cache, основы работы со словарями, передачу функций, lambda и парадигмы программирования.

Что запомнить: функцию передают без скобок; @lru_cache(maxsize=...) кэширует результаты; frozenset неизменяем и хешируем; OrderedDict управляет порядком через move_to_end() и popitem().

Топ-3 ошибки: передавать func() вместо ссылки func; забывать list() вокруг map/filter; пытаться изменить frozenset или использовать обычный set как ключ словаря.

Решение 1. Инверсия словаря

original_dict = {"a": 1, "b": 2, "c": 3}
inverted_dict = {}
for key in original_dict:
    inverted_dict[original_dict[key]] = key
print("Инверсированный словарь:", inverted_dict)

# современный вариант:
# inverted_dict = {v: k for k, v in original_dict.items()}

По каждому ключу записываем в новый словарь пару значение → ключ.

Решение 2. Из чисел в слова

number_to_word = {1: "один", 2: "два", 3: "три"}
data = {"x": 1, "y": 2, "z": 3}
for key in data:
    if data[key] in number_to_word:
        data[key] = number_to_word[data[key]]
print(data)

Если текущее значение есть в словаре перевода, заменяем его строкой.

Решение 3. Список квадратов чисел

def square_numbers(numbers):
    return list(map(lambda x: x ** 2, numbers))

numbers = [1, 2, 3, 4, 5]
print(square_numbers(numbers))

map применяет lambda к каждому элементу, list материализует итератор.

Решение 4. Сортировка по возрасту

def sort_by_age(people):
    return sorted(people, key=lambda person: person[1])

people = [("Mike", 19), ("Nancy", 35), ("Charlie", 23), ("Oscar", 33), ("Eve", 29), ("Frank", 33), ("Bob", 20), ("Grace", 27), ("Isabella", 19), ("Jack", 24), ("Alice", 25), ("Kevin", 28), ("Laura", 31), ("Diana", 30), ("Henry", 19)]
print(sort_by_age(people))

Ключом сортировки служит второй элемент кортежа.

Решение 5. Сортировка по возрасту и имени

def sort_by_age_and_name(people):
    return sorted(people, key=lambda person: (-person[1], person[0]))

people = [("Mike", 19), ("Nancy", 35), ("Charlie", 23), ("Oscar", 33), ("Eve", 29), ("Frank", 33), ("Bob", 20), ("Grace", 27), ("Isabella", 19), ("Jack", 24), ("Alice", 25), ("Kevin", 28), ("Laura", 31), ("Diana", 30), ("Henry", 19)]
print(sort_by_age_and_name(people))

Отрицательный возраст даёт убывание, имя сортируется по возрастанию.

Решение 6. Фильтрация и преобразование сотрудников

def process_employees(employees):
    filtered = filter(lambda emp: emp["age"] > 30, employees)
    updated = map(
        lambda emp: {**emp, "salary": emp["salary"] * 1.2},
        filtered
    )
    return list(updated)

employees = [
    {"name": "Alice", "age": 25, "salary": 50000},
    {"name": "Bob", "age": 35, "salary": 60000},
    {"name": "Charlie", "age": 40, "salary": 70000},
    {"name": "Diana", "age": 28, "salary": 55000},
    {"name": "Eve", "age": 45, "salary": 80000}
]
print(process_employees(employees))

{**emp, ...} создаёт новый словарь сотрудника и не изменяет исходный.

Решение 7. Повторения букв

from collections import Counter

text = "Programming is fun!"
letters = (char.lower() for char in text if char.isalpha())
counts = Counter(letters)
print(dict(counts))

Counter подсчитывает элементы; генератор отфильтровывает только буквы и приводит к нижнему регистру.

Решение 8. Группировка студентов по классам

from collections import defaultdict

students = [("class1", "Alice"), ("class2", "Bob"), ("class1", "Charlie"), ("class3", "Daisy")]
groups = defaultdict(list)
for class_name, student in students:
    groups[class_name].append(student)
print(dict(groups))

defaultdict(list) автоматически создаёт пустой список для нового ключа.

Решение 9. Выбор заказов

def select_expensive_orders(orders):
    selected = filter(lambda order: order["price"] > 500, orders)
    names = map(lambda order: order["product"], selected)
    return sorted(names)

orders = [
    {"product": "Laptop", "price": 1200},
    {"product": "Mouse", "price": 50},
    {"product": "Keyboard", "price": 100},
    {"product": "Monitor", "price": 300},
    {"product": "Chair", "price": 800},
    {"product": "Desk", "price": 400}
]
print(select_expensive_orders(orders))

filter отбирает дорогие заказы, map достаёт названия, sorted сортирует по алфавиту.

Решение 10. Статистика продаж

def sales_revenue(sales):
    revenue = {product: quantity * price for product, quantity, price in sales}
    sorted_items = sorted(revenue.items(), key=lambda item: item[1], reverse=True)
    return dict(sorted_items)

sales = [("Laptop", 5, 1200), ("Mouse", 50, 20), ("Keyboard", 30, 50), ("Monitor", 10, 300), ("Chair", 20, 800)]
print(sales_revenue(sales))

Сначала считаем выручку, затем сортируем пары по значению в обратном порядке.