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.
Учебный/наивный подход
Современный вариант
Почему так
Удалять ключи прямо в цикле for key, value in data.items().
Итерироваться по list(data) или собрать новый словарь.
Размер словаря нельзя менять во время активной итерации по view.
dict.fromkeys(keys, []) для независимых списков.
{key: [] for key in keys}.
fromkeys() положит одну и ту же ссылку на список во все ключи.
Решать проверку скобок цепочкой replace().
Использовать стек и словарь пар.
Стек явно моделирует порядок закрытия скобок.
Проверить по документации: рекомендации по стилю и стандартной библиотеке могут уточняться в новых версиях Python.