Коллекции и структуры данных: вопросы для собеседования (часть 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Создаст новый кортеж со значением `(9, 2)`, а исходный `t` останется `(1, 2)`.
CАвтоматически преобразует `t` в список и присвоит `9` первому элементу.
DПоднимет `TypeError`, потому что элементы кортежа нельзя менять по индексу.
Ответ: Элементы `tuple` нельзя менять по индексу: попытка присваивания приводит к `TypeError`.

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

Подробный разбор →
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`. Внутри `namedtuple` хранится как кортеж, а не словарь.

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

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

Подробный разбор →
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)]`: два самых частых элемента и их счётчики из `Counter`
CЧисло `3`: общее количество вхождений самого частого элемента из набора в `Counter`
DСтроку `'click'`: имя самого частого элемента из счётчика `Counter` без числового счёта
Ответ: `c.most_common(n)` возвращает список из `n` пар `(элемент, количество)`, отсортированных по убыванию частоты.

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

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

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

Подробный разбор →
12345678

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

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

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

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

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