Коллекции и структуры данных: вопросы для собеседования (часть 3)

Списки, словари, множества, кортежи — базовые структуры данных Python, без которых не обойтись ни в анализе, ни на собеседовании. Спрашивают про сложность операций, разницу между list и tuple, когда использовать set вместо list. Понимание коллекций показывает, что кандидат пишет эффективный код, а не просто «работающий».

Генераторы списков и встроенные функцииЦиклы и условияИсключения и отладкаРабота с файлами: JSON и CSVФункции и аргументыИтераторы и генераторыNumPy: основыPandas и DataFrameСинтаксис и типы данных

Вопросы 1115 из 40

11Что произойдёт при выполнении кода `t = (1, 2); t[0] = 9`?
AИзменит первый элемент, и `t` станет `(9, 2)`.
BСоздаст новый кортеж и вернёт его, а `t` останется `(1, 2)`.
CАвтоматически преобразует `t` в `list` и изменит его.
DВыбросит `TypeError`, потому что `tuple` неизменяемый.
Ответ: Элементы `tuple` нельзя менять по индексу: попытка присваивания приводит к `TypeError`.

`tuple` — неизменяемая коллекция. Это означает, что операции вида `t[0] = ...` недопустимы. Если нужна изменяемость, используйте `list`. Если нужна фиксированная структура (например, пара значений), `tuple` помогает избежать случайных изменений.

12Чем `namedtuple` из модуля `collections` удобнее обычного `tuple` при хранении записей вида (имя, возраст, город)?
AДоступ к полям по имени через атрибут: `user.name` вместо `user[0]`
BВозможность изменять поля после создания: `user.name = 'Иван'`
CАвтоматическая валидация типов при создании: `User(name=1)` вызовет `TypeError`
DХранение данных внутри `dict`, а не `tuple`, для быстрого поиска по ключу
Ответ: `namedtuple` позволяет обращаться к полям по имени, а не только по индексу, что делает код читаемее.

Обычный `tuple` позволяет доступ только по индексу: `user[0]`, `user[1]`. С `namedtuple` можно писать `user.name`, `user.age` — это понятнее и снижает вероятность ошибок. При этом `namedtuple` остаётся неизменяемым, как обычный кортеж. Присвоение `user.name = 'Иван'` вызовет `AttributeError`. Валидации типов тоже нет — для этого используют `dataclass` или `pydantic`.

13Нужно сгруппировать пользователей по городу: для каждого города хранить список `user_id`. Используется `defaultdict` из модуля `collections`. Какой аргумент передать при создании?
AПередать `int` — тогда при обращении к новому ключу создастся значение `0`
BПередать `str` — тогда при обращении к новому ключу создастся пустая строка
CПередать `set` — тогда при обращении к новому ключу создастся пустое множество
DПередать `list` — тогда при обращении к новому ключу создастся пустой список
Ответ: Для группировки элементов в списки передайте `list` как фабрику значений по умолчанию: `defaultdict(list)`.

`defaultdict(list)` при обращении к несуществующему ключу автоматически создаст пустой `[]`. Это позволяет сразу писать `groups[city].append(user_id)` без предварительной проверки ключа. Аналогично `defaultdict(int)` создаёт `0` для счётчиков, а `defaultdict(set)` — пустое множество для уникальных значений.

14Дан код: ```python from collections import Counter events = ['click', 'view', 'click', 'click', 'view', 'purchase'] c = Counter(events) ``` Что вернёт `c.most_common(2)`?
AСловарь `{'click': 3, 'view': 2}` без пары для `'purchase'`
BСписок `[('click', 3), ('view', 2)]` — два самых частых элемента
CЧисло `3` — количество вхождений самого частого элемента
DСтроку `'click'` — название самого частого элемента из счётчика
Ответ: `.most_common(n)` возвращает список из `n` пар `(элемент, количество)`, отсортированных по убыванию частоты.

`Counter` подсчитывает вхождения каждого элемента. В нашем случае: `click` — 3, `view` — 2, `purchase` — 1. Вызов `.most_common(2)` вернёт два самых частых элемента в виде списка кортежей: `[('click', 3), ('view', 2)]`. Без аргумента `.most_common()` вернёт все элементы, отсортированные по убыванию.

15Есть пустой словарь `groups = {}`. Что произойдёт при выполнении `groups.setdefault('RU', []).append(7)`?
AДобавит ключ `'RU'` со значением `[]`, затем добавит `7` в этот список
BПерезапишет значение ключа `'RU'` пустым списком, а потом добавит `7`
CВыбросит `KeyError`, потому что ключа `'RU'` ещё нет в словаре
DВернёт `None`, а `7` не будет добавлен, потому что ключ отсутствует
Ответ: `.setdefault(key, default)` возвращает значение по ключу, а если ключа нет — записывает `default` и возвращает его.

Вызов `groups.setdefault('RU', [])` проверяет наличие ключа `'RU'`. Поскольку его нет, метод записывает `'RU': []` и возвращает ссылку на этот новый список. Затем `.append(7)` добавляет элемент в этот список. В итоге `groups` станет `{'RU': [7]}`. Если ключ уже существует, `.setdefault()` не перезаписывает значение, а просто возвращает текущее.

12345678

Хотите тренировать интерактивно?

В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.

Тренировать в Telegram

Другие темы: Python

Генераторы списков и встроенные функцииЦиклы и условияИсключения и отладкаРабота с файлами: JSON и CSVФункции и аргументыИтераторы и генераторыNumPy: основыPandas и DataFrameСинтаксис и типы данных