✅ Решения

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

fromkeys(), get(), setdefault(), keys(), values() и items() повторяются как базовый набор методов словаря.

View objects отражают изменения словаря, а list(view) создаёт снимок.

Вложенные структуры требуют цепочки ключей и индексов.

copy() копирует только внешний словарь, deepcopy() копирует вложенные объекты.

Dict comprehension подходит для преобразования и фильтрации словаря.

Функции повторяются через def, pass, return, *args/**kwargs и LEGB.

Практическая задача со скобками решается стеком и словарём соответствий.

global работает, но параметры и return обычно дают более предсказуемый код.

Топ-3 ошибки: менять словарь во время итерации по items(); ожидать независимых списков от dict.fromkeys(keys, []); путать локальную переменную и global.

Решение 1. Проверка скобок

def is_valid_brackets(text):
    pairs = {")": "(", "]": "[", "}": "{"}
    stack = []
    for char in text:
        if char in pairs.values():
            stack.append(char)
        elif char in pairs:
            if not stack or stack.pop() != pairs[char]:
                return False
    return len(stack) == 0

print(f"Скобки валидны: {is_valid_brackets('([)]')}")

Если закрывающая скобка не совпала с последней открывающей, порядок нарушен.

Решение 2. Проверка знака

def check_number(num):
    if num > 0:
        return "Число положительное"
    if num < 0:
        return "Число отрицательное"
    return "Число равно нулю"

print(check_number(-3))

Несколько return читаются проще, чем глубокая вложенность if/else.

Решение 3. Повтор fromkeys

keys = ["x", "y"]
my_dict = {key: [] for key in keys}
my_dict["x"].append(1)
print(my_dict)

Dict comprehension создаёт новый список для каждого ключа.