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

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

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

Вопросы 3640 из 40

36Начиная с Python 3.7 обычный `dict` тоже сохраняет порядок вставки. В каком случае `OrderedDict` из `collections` всё ещё полезнее?
AКогда нужен словарь, который автоматически сортирует ключи по алфавиту
BКогда нужен словарь с ограничением на максимальное количество ключей
CКогда нужен словарь, который запрещает перезапись существующих ключей
DКогда при сравнении двух словарей важен порядок добавления ключей
Ответ: `OrderedDict` учитывает порядок при сравнении: два `OrderedDict` с одинаковыми ключами, но в разном порядке, не равны.

Обычный `dict` в Python 3.7+ сохраняет порядок вставки, но при сравнении `==` порядок не учитывается: `{'a': 1, 'b': 2} == {'b': 2, 'a': 1}` вернёт `True`. Для `OrderedDict` порядок важен, и такие словари не будут равны. Также `OrderedDict` поддерживает метод `.move_to_end()`, которого нет у обычного `dict`.

37Дан код: ```python d = {'a': 1, 'b': 2} k = d.keys() d['c'] = 3 ``` Что будет в `k` после выполнения?
AВернёт `dict_keys(['a', 'b'])`, потому что `keys` — это снимок на момент вызова
BВернёт пустой `dict_keys([])`, потому что словарь был изменён после вызова
CВыбросит `RuntimeError`, потому что словарь изменился после вызова `.keys()`
DВернёт `dict_keys(['a', 'b', 'c'])`, потому что `keys` — это динамическое представление
Ответ: `.keys()` возвращает динамическое представление (view), которое отражает текущее состояние словаря.

Объект `dict_keys`, возвращаемый `.keys()`, не копирует ключи, а ссылается на сам словарь. Поэтому после добавления нового ключа `'c'` представление `k` тоже покажет три ключа. То же самое касается `.values()` и `.items()`. Если нужен фиксированный снимок ключей, используйте `list(d.keys())`.

38Вы хотите хранить координату точки как пару значений и использовать её как ключ в `dict`. Что обычно подходит лучше для самой координаты?
A`list`, потому что легко менять элементы.
B`set`, потому что хранит уникальные элементы.
C`dict`, потому что это тоже коллекция.
D`tuple`, потому что это неизменяемая пара и может быть ключом в `dict`.
Ответ: Ключи в `dict` должны быть неизменяемыми; для пары значений обычно выбирают `tuple`.

Если координата — фиксированная пара (например, `(x, y)` или `(lat, lon)`), `tuple` хорошо подходит: его нельзя случайно изменить, и такой объект можно использовать как ключ в `dict`. `list` изменяемый и поэтому плохо подходит для роли ключа. `set` не хранит порядок и вообще не предназначен для пары с фиксированными позициями.

39Дан код: ```python a = [[1, 2], [3, 4]] b = a.copy() a[0].append(99) ``` Будет ли `99` в `b[0]`?
AВ `b` тоже появится `99`, потому что `.copy()` создаёт поверхностную копию
BВ `b` останется `[1, 2]`, потому что `.copy()` полностью копирует вложенные списки
CБудет исключение `TypeError` при попытке добавить элемент во вложенный список
DВ `a` не изменится ничего, потому что `append` создаст новый вложенный список
Ответ: Метод `.copy()` создаёт поверхностную копию: внешний список новый, но вложенные объекты — те же самые.

При поверхностной копии (`.copy()` или `list(a)`) создаётся новый внешний список, но его элементы — те же объекты. Поэтому `a[0]` и `b[0]` ссылаются на один и тот же вложенный список. Добавление `99` через `a[0].append(99)` отразится и в `b[0]`. Для полной независимости используйте `copy.deepcopy(a)`, который рекурсивно копирует все вложенные объекты.

40Есть функция `def f(x, y): return x + y` и словарь `params = {'x': 1, 'y': 2}`. Что произойдёт при вызове `f(**params)`?
AВызов `f(**params)` передаст `x=1, y=2` как именованные аргументы
BВызов `f(**params)` передаст `params` как один позиционный аргумент
CВызов `f(**params)` передаст ключи `'x'` и `'y'` как позиционные аргументы
DВызов `f(**params)` вызовет `TypeError`, если ключи словаря — строки
Ответ: Оператор `**` при вызове функции распаковывает словарь в именованные аргументы: ключи становятся именами параметров.

Запись `f(**params)` эквивалентна `f(x=1, y=2)`. Ключи словаря должны совпадать с именами параметров функции и быть строками. Если в словаре есть ключ, которого нет в сигнатуре функции (и нет `**kwargs`), будет `TypeError`. Аналогично, `*` распаковывает список или кортеж в позиционные аргументы.

12345678

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

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

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

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

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