✅ Решения

⚡ Кратко: решения

Counter подходит для популярных слов.

defaultdict(list) удобно группирует задачи и слова.

Поиск задач по категории можно сделать фильтрацией items().

OrderedDict позволяет менять порядок задач без создания новой очереди.

defaultdict(int) подходит для подсчёта посещений страниц.

global нужен только в задаче со счётчиком вызовов, но в проектах лучше избегать такой зависимости.

LRU-очередь можно моделировать через OrderedDict и move_to_end().

Каждое решение лучше оформлять функцией с понятными параметрами.

Топ-3 ошибки: не нормализовать регистр слов; создавать новую очередь вместо изменения исходной; забыть удалить старые элементы при превышении LRU-лимита.

Решение 1. Популярные слова

from collections import Counter

def popular_words(limit, *texts):
    words = []
    for text in texts:
        words.extend(text.lower().replace(".", "").replace(",", "").split())
    return Counter(words).most_common(limit)

print(popular_words(5, "This is text.", "This text repeats text."))

Counter получает нормализованные слова из всех переданных строк.

Решение 2. Группировка задач

from collections import defaultdict

def group_tasks(tasks):
    result = defaultdict(list)
    for task, category in tasks.items():
        result[category].append(task)
    return dict(result)

print(group_tasks({"task1": "работа", "task2": "учёба", "task3": "работа"}))

Категория становится ключом, список задач накапливается автоматически.

Решение 3. Поиск задач

def find_tasks_by_category(tasks, category):
    return [task for task, task_category in tasks.items() if task_category == category]

tasks = {"task1": "работа", "task2": "учёба", "task3": "развлечения", "task4": "работа", "task5": "учёба"}
print(find_tasks_by_category(tasks, "учёба"))

List comprehension читает все пары и оставляет задачи нужной категории.

Решение 4. Очередь задач с приоритетом

from collections import OrderedDict

def sort_priority_queue(tasks):
    priority = {"высокий": 0, "средний": 1, "низкий": 2}
    ordered_items = sorted(tasks.items(), key=lambda item: priority[item[1]])
    tasks.clear()
    tasks.update(ordered_items)
    return tasks

tasks = OrderedDict({"task1": "низкий", "task2": "средний", "task3": "высокий", "task4": "низкий", "task5": "высокий"})
print(sort_priority_queue(tasks))

clear()/update() сохраняют тот же объект OrderedDict, но переставляют элементы.

Решение 5. Посещения страниц

from collections import defaultdict

def count_page_visits(pages):
    visits = defaultdict(int)
    for page in pages:
        visits[page] += 1
    return dict(visits)

pages = ["home", "about", "home", "products", "home", "contact", "products"]
print(count_page_visits(pages))

defaultdict(int) стартует отсутствующий счётчик с нуля.

Решение 6. Слова по длине

from collections import defaultdict

def group_words_by_length(words):
    result = defaultdict(list)
    for word in words:
        result[len(word)].append(word)
    return dict(result)

words = ["apple", "banana", "kiwi", "grape", "orange", "peach"]
print(group_words_by_length(words))

Длина слова является ключом группировки.

Решение 7. Глобальный счётчик

counter = 0

def increment_counter():
    global counter
    counter += 1

increment_counter()
increment_counter()
print(f"Вызовов функции: {counter}")

global нужен, потому что функция присваивает новое значение переменной counter.

Решение 8. LRU-очередь

from collections import OrderedDict

def update_lru_queue(tasks, new_tasks, max_size):
    queue = OrderedDict.fromkeys(tasks)
    for task in new_tasks:
        if task in queue:
            queue.move_to_end(task)
        else:
            queue[task] = None
        while len(queue) > max_size:
            queue.popitem(last=False)
    return list(queue)

print(update_lru_queue(["task1", "task2", "task3", "task4", "task5", "task6"], ["task4", "task1", "task7", "task2"], 4))

OrderedDict хранит порядок использования: слева старые элементы, справа новые.