Что такое бакет в хэш-таблице
Что проверяют
Знаете ли вы не только общую схему хэш-таблицы, но и то, как устроен словарь в CPython. Формулировка вопроса книжная, а сильный ответ показывает, что вы различаете схему из учебника и реализацию, с которой работаете каждый день.
Как отвечать
В общей теории бакет это ячейка таблицы, куда хэш-функция отображает ключ, и место, где разрешается коллизия.
Дальше важно сказать, что бакетов со списками внутри в CPython нет. Словарь и множество используют открытую адресацию: индекс берётся из младших битов хэша, а при занятой ячейке пробуется следующая по детерминированной последовательности, которая подмешивает старшие биты, чтобы разные ключи не шли по одному и тому же пути.
Ещё одна деталь реализации: у современного словаря два массива. Разреженный массив индексов и плотный массив записей с тройками хэш, ключ, значение в порядке вставки. Отсюда и порядок обхода, и экономия памяти.
Что стоит проговорить дальше: удаление оставляет метку, а не пустоту, иначе поиск оборвался бы на середине цепочки проб; таблица растёт при заполнении примерно на две трети, а её размер всегда степень двойки; сравнение идёт сначала по хэшу, потом по равенству, поэтому объект обязан соблюдать контракт __hash__ и __eq__.
Где спотыкаются
Рассказывают про связные списки в бакетах как про устройство словаря в Python. Это описание другой реализации: цепочки лежат в основе стандартной таблицы Java, а здесь коллизии разрешаются пробированием.
Считают доступ по ключу гарантированно быстрым. Амортизированно да, но при собственном __hash__, который возвращает константу, все ключи уходят в одну цепочку проб, и словарь вырождается в линейный поиск.
Делают ключом объект, чей хэш зависит от изменяемых полей, и меняют его после вставки. Хэш посчитан при добавлении, искать запись будут уже в другой ячейке, и она останется в словаре недостижимой.