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

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

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

Вопросы 610 из 40

6Дан код:\n```python\na = {1, 2, 3}\nb = a.copy()\na.add(4)\n```\nЧто будет в `b`?
AОба множества изменятся: и в `a`, и в `b` появится элемент `4` после вызова `add`
BТолько в `b` добавится `4`, а множество `a` останется неизменным `{1, 2, 3}`
CТолько в `a` добавится `4`, а множество `b` останется прежним `{1, 2, 3}`
DБудет ошибка `AttributeError`: у `set` нет метода `.copy()` для копирования множества
Ответ: `.copy()` у `set` создаёт независимую поверхностную копию, поэтому изменения одного множества не влияют на другое.

Вызов `a.copy()` создаёт новый объект `set` с теми же элементами. Поскольку элементы множества — неизменяемые значения (числа), `a.add(4)` затронет только `a`. Множество `b` останется `{1, 2, 3}`. Для множеств, содержащих только примитивы, поверхностная копия фактически эквивалентна глубокой.

Подробный разбор →
7В логах есть список `user_ids` с повторениями. Как получить количество уникальных пользователей?
A`len(user_ids)`
B`user_ids.unique()`
C`len(set(user_ids))`
D`sum(user_ids)`
Ответ: `set` хранит только уникальные элементы, поэтому `len(set(user_ids))` даёт число уникальных значений.

Преобразование `set(user_ids)` удаляет дубликаты, оставляя только уникальные `user_id`. Затем `len(...)` считает количество элементов. Важно помнить, что `set` не предназначен для сохранения порядка элементов, но для подсчёта уникальных значений это обычно неважно.

Подробный разбор →
8Даны два словаря `d1 = {'a': 1, 'b': 2}` и `d2 = {'b': 3, 'c': 4}`. Что вернёт выражение `d1 | d2` в Python 3.9+?
AСловарь `{'a': 1, 'b': 2, 'b': 3, 'c': 4}` с двумя записями по ключу `'b'`
BСловарь `{'a': 1, 'b': 3, 'c': 4}`: значение из правого словаря перезаписывает левое
CСловарь `{'a': 1, 'b': 2, 'c': 4}`: при совпадении ключа сохраняется значение из левого
DОшибка `TypeError`: оператор `|` для типа `dict` в стандартной реализации не определён
Ответ: Оператор `|` объединяет словари; при совпадении ключей значения из правого словаря перезаписывают левый.

Начиная с Python 3.9, можно объединять словари оператором `|`. Результат — новый словарь со всеми ключами. Если ключ встречается в обоих словарях, побеждает значение из правого операнда. Аналогичное поведение у `{**d1, **d2}`, доступного с Python 3.5. Для обновления существующего словаря на месте используйте `d1 |= d2`.

Подробный разбор →
9Дан список словарей: ```python users = [ {'name': 'Анна', 'age': 25}, {'name': 'Борис', 'age': 30} ] ``` Как получить имя первого пользователя?
AИспользовать `users.get(0).get('name')`
BИспользовать `users['name'][0]`
CИспользовать `users[0]['name']`
DИспользовать `users.name[0]`
Ответ: В списке словарей сначала обращаемся по индексу к элементу списка, а потом по ключу к словарю.

Переменная `users` — это список, элементы которого — словари. Сначала берём элемент по индексу `users[0]`, получая словарь `{'name': 'Анна', 'age': 25}`. Затем обращаемся по ключу `['name']` и получаем строку. Обращение `users['name']` вызовет `TypeError`, потому что индекс списка должен быть целым числом, а не строкой. Метод `.get` есть только у словаря, а доступ через точку к ключам словаря в Python не работает.

Подробный разбор →
10После выполнения кода `lst = [1, 2]; lst.append([3, 4])` чему равно `lst`?
A`[1, 2, 3, 4]`: элементы переданного списка добавлены по одному, как при `.extend([3, 4])`
B`[1, 2]`: вызов `.append([3, 4])` исходный список не меняет при таком типе аргумента
C`[1, 2, [3, 4]]`: метод добавил один элемент в конец, и этим элементом стал список
D`[3, 4, 1, 2]`: метод `.append([3, 4])` вставил аргумент в начало исходного списка
Ответ: Метод `.append()` добавляет один элемент в конец списка, даже если этот элемент — другой список.

Метод `.append(x)` добавляет ровно один элемент `x`. Поэтому `.append([3, 4])` добавит список как единый элемент, и получится вложенная структура `[1, 2, [3, 4]]`. Если нужно добавить элементы по одному из списка, используют `.extend([3, 4])` — тогда получится `[1, 2, 3, 4]`. Метод `.append()` не вставляет в начало и всегда возвращает `None`, изменяя список на месте.

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

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

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

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

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

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