Коллекции и структуры данных: вопросы для собеседования (часть 6)
Списки, словари, множества, кортежи — базовые структуры данных Python, без которых не обойтись ни в анализе, ни на собеседовании. Спрашивают про сложность операций, разницу между list и tuple, когда использовать set вместо list. Понимание коллекций показывает, что кандидат пишет эффективный код, а не просто «работающий».
Вопросы 26–30 из 40
26При обработке событий нужно хранить идентификаторы пользователей, которых уже видели, чтобы быстро проверять `user_id in seen` и не хранить дубликаты. Что лучше использовать для `seen`?
A`list`: упорядоченная коллекция с дубликатами и линейной по размеру проверкой `in`
B`tuple`: неизменяемый кортеж для фиксированных пар без поддержки добавления элементов
C`dict`: коллекция пар ключ → значение с возможностью хранить рядом с ключом данные
D`set`: коллекция уникальных элементов с константной в среднем проверкой `in` через хеш
Ответ: `set` хранит уникальные элементы и обеспечивает быструю проверку `x in s` за счёт хеш-таблицы под капотом.
`list` и `tuple` допускают дубликаты и обычно используются, когда важен порядок элементов; проверка `in` у них линейная по размеру коллекции. `dict` нужен, когда рядом с ключом хранится значение. Для задачи «видели ли уже этот идентификатор» и дедупликации чаще всего выбирают `set` — он автоматически отбрасывает повторы и даёт почти константный поиск.
Подробный разбор → 27Какое утверждение про `set` верное?
A`set` поддерживает доступ `s[0]` и срезы `s[1:3]` как `list`
B`set` хранит дубликаты в порядке вставки как `list` в Python
C`set` отдаёт элементы при итерации `s` в отсортированном порядке
D`set` хранит уникальные элементы и удобен для проверки `x in s`
Ответ: `set` — это коллекция уникальных элементов; её часто используют для дедупликации и проверок `x in s`.
В `set` каждый элемент может быть только один раз. Это делает `set` удобным для задач вроде «убрать дубликаты» и «проверить, встречалось ли значение». У `set` нет индексации и срезов, а порядок элементов не следует считать стабильным или отсортированным.
Подробный разбор → 28Есть словарь метрик `metrics = {"views": 100, "clicks": 5}`. Как корректно пройтись по парам ключ-значение в цикле `for`?
A`for k, v in metrics:`
B`for k, v in metrics.items():`
C`for k, v in metrics.values():`
D`for k, v in metrics.keys():`
Ответ: Для обхода пар ключ-значение используйте `.items()`.
Итерация по словарю по умолчанию даёт ключи, поэтому `for k in metrics:` — это обход ключей. Чтобы получить одновременно ключ и значение, используйте `metrics.items()`, где каждый элемент — пара `(key, value)`. Методы `metrics.keys()` и `metrics.values()` возвращают только ключи или только значения соответственно.
Подробный разбор → 29Есть `scores = [3, 1, 2]`. Нужно получить новый отсортированный список, не изменяя исходный `scores`. Что выбрать?
A`sorted(scores)`: возвращает новый отсортированный список, исходный `scores` не меняется
B`scores.sort()`: сортирует список на месте и возвращает `None` после изменения
C`sort(scores)`: вызов глобальной функции `sort` приведёт к `NameError`
D`scores.sorted()`: вызов несуществующего метода списка приведёт к `AttributeError`
Ответ: `sorted()` возвращает новый список, а `.sort()` сортирует список на месте и возвращает `None`.
Если важно не менять исходный список (например, он нужен для других вычислений), используют `sorted(scores)` — функция создаёт новый отсортированный список. Метод `.sort()` сортирует список на месте и возвращает `None`, поэтому он удобен, когда исходный список менять можно. Глобальной функции `sort()` в Python нет, а у списков нет метода `.sorted()` — оба варианта приведут к ошибке.
Подробный разбор → 30Есть множество пользователей `shown` (показали баннер) и `clicked` (кликнули по баннеру). Как получить пользователей, которым показали баннер, но которые не кликнули?
A`shown & clicked`
B`shown - clicked`
C`clicked - shown`
D`shown ^ clicked`
Ответ: Разность множеств `a - b` возвращает элементы, которые есть в `a`, но отсутствуют в `b`.
Для анализа воронки это частый приём: `shown - clicked` даёт аудиторию без клика. Для сравнения: `shown & clicked` — это пересечение, те, кто и видел, и кликнул; `clicked - shown` — теоретически пустое множество, если баннер не кликали без показа; `shown ^ clicked` — симметричная разность, элементы, попавшие только в одно из множеств.
Подробный разбор →