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

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

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

Вопросы 3135 из 40

31Есть очередь задач `q = deque(['task1', 'task2'])`. Что произойдёт после вызова `q.appendleft('urgent')`?
AДобавит `'urgent'` в конец очереди: `deque(['task1', 'task2', 'urgent'])`
BДобавит `'urgent'` в начало очереди: `deque(['urgent', 'task1', 'task2'])`
CЗаменит первый элемент на `'urgent'`: `deque(['urgent', 'task2'])`
DВыбросит `AttributeError`, потому что `deque` не поддерживает этот метод
Ответ: Метод `.appendleft(x)` добавляет элемент в начало `deque` за время O(1).

`deque` (двусторонняя очередь) поддерживает быстрое добавление и удаление с обоих концов. `.appendleft('urgent')` вставит элемент в начало, и результат будет `deque(['urgent', 'task1', 'task2'])`. У обычного `list` вставка в начало через `.insert(0, x)` работает за O(n), потому что сдвигает все элементы. Для `deque` это O(1).

32Есть словарь `user = {"id": 7}`. Поле `"profile"` может отсутствовать, а если присутствует, то возраст лежит в `user["profile"]["age"]`. Как безопасно получить возраст без `KeyError`, чтобы при отсутствии вернулось `None`?
A`user.get("profile", {}).get("age")`
B`user["profile"].get("age")`
C`user.get("profile").get("age")`
D`user["age"]`
Ответ: Можно взять `user.get("profile", {})`, а затем вызвать `.get("age")` у полученного словаря.

Если `"profile"` отсутствует, выражение `user.get("profile", {})` вернёт пустой словарь `{}`. Тогда `.get("age")` вернёт `None` без исключения. Вариант `user.get("profile").get("age")` опасен: если `"profile"` нет, `.get("profile")` вернёт `None`, а у `None` нет метода `.get()`.

33Вы считаете количество событий по типу в словаре `counts = {}`. Приходит значение `event_type`. Какой код корректно увеличивает счётчик, даже если ключа ещё нет?
A`counts[event_type] += 1`
B`counts[event_type] = counts.get(event_type, 0) + 1`
C`counts.get(event_type) += 1`
D`counts.items(event_type, 0) + 1`
Ответ: Шаблон `d[k] = d.get(k, 0) + 1` безопасно работает, даже если ключа `k` ещё нет.

Если сделать `counts[event_type] += 1`, при первом появлении ключа будет `KeyError`. `.get(event_type, 0)` вернёт текущее значение, а если ключ отсутствует — 0, после чего можно прибавить 1 и записать обратно в `dict`.

34Даны два счётчика: ```python from collections import Counter c1 = Counter({'a': 3, 'b': 1}) c2 = Counter({'a': 2, 'b': 2}) ``` Что вернёт `c1 - c2`?
A`Counter({'a': 4, 'b': 3})` — суммы всех счётчиков обоих объектов
B`Counter({'a': 1, 'b': -1})` — разница с учётом отрицательных значений
C`Counter({'a': 1})` — только элементы с положительной разницей
D`Counter()` — пустой счётчик, потому что вычитание обнуляет значения
Ответ: Вычитание `Counter` отбрасывает нулевые и отрицательные значения, оставляя только положительные.

При вычитании `c1 - c2` считается разница по каждому ключу: `a` = 3 - 2 = 1, `b` = 1 - 2 = -1. Однако `Counter` при арифметических операциях автоматически исключает элементы с нулевым или отрицательным счётчиком. Поэтому `b` не попадёт в результат, и ответ — `Counter({'a': 1})`. Для сохранения отрицательных значений используйте метод `.subtract()`.

35Есть `d = deque(['a', 'b', 'c'])`. Что произойдёт после `d.rotate(-1)`?
AПеремещает последний элемент в начало: `deque(['c', 'a', 'b'])`
BУдаляет первый элемент и сдвигает остальные: `deque(['b', 'c'])`
CПеремещает первый элемент в конец: `deque(['b', 'c', 'a'])`
DПереворачивает всю очередь задом наперёд: `deque(['c', 'b', 'a'])`
Ответ: `.rotate(-1)` сдвигает элементы влево на одну позицию: первый элемент перемещается в конец.

Метод `.rotate(n)` выполняет циклический сдвиг элементов. Положительный `n` сдвигает вправо (с конца в начало), отрицательный — влево (с начала в конец). При `d.rotate(-1)` элемент `'a'` переместится в конец, и результат будет `deque(['b', 'c', 'a'])`. Это эквивалентно `d.append(d.popleft())`, но выполняется за одну операцию.

12345678

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

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

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

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

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