Назовите два недостатка использования множества для удаления дубликатов из списка в Python
Что проверяют
Понимаете ли вы, что set это хеш-таблица со своими требованиями к элементам, а не универсальный уникализатор. Формулировка «назовите два» проверяет, назовёте ли вы настоящие ограничения или начнёте придумывать проблемы с производительностью, которых у множества нет.
Как отвечать
Первый недостаток: теряется порядок. Множество не гарантирует порядок обхода, поэтому list(set(items)) вернёт элементы как попало. Когда порядок важен, берут словарь, он сохраняет порядок вставки:
items = [3, 1, 3, 2, 1]
list(set(items)) # порядок не гарантирован
list(dict.fromkeys(items)) # [3, 1, 2]Второй недостаток: элементы обязаны быть хешируемыми. Список, словарь, множество и любой изменяемый объект в set не положить, получите TypeError: unhashable type. Список словарей так не почистить, каждый элемент придётся приводить к кортежу или frozenset, а это уже отдельный код и потеря исходных объектов.
Если просят третий недостаток, скажите про сравнение по __hash__ и __eq__: уникальность считается по равенству, а не по типу.
Про скорость говорить не стоит: дедупликация через множество линейна и как раз быстрее наивной проверки if x not in result по списку, которая даёт квадратичную сложность.
Где спотыкаются
Называют недостатком лишнюю память и просадку производительности. Память действительно тратится, но это плата за линейную сложность вместо квадратичной, и как претензия к методу такой ответ не держится. Интервьюер обычно переспрашивает, с чем именно вы сравниваете.
Забывают, что {1, 1.0, True} схлопывается в один элемент. Целое, вещественное и булево с одинаковым значением равны и дают одинаковый хеш, поэтому из смешанного списка молча пропадут значения, которые автор считал разными.
Предлагают множество для списка объектов своего класса и не проверяют, определены ли в нём __eq__ и __hash__. По умолчанию объекты сравниваются по идентичности, дубликаты по содержимому не схлопнутся, и дедупликация тихо не сработает.