Коллекции и структуры данных: вопросы для собеседования (часть 2)
Списки, словари, множества, кортежи — базовые структуры данных Python, без которых не обойтись ни в анализе, ни на собеседовании. Спрашивают про сложность операций, разницу между list и tuple, когда использовать set вместо list. Понимание коллекций показывает, что кандидат пишет эффективный код, а не просто «работающий».
Вопросы 6–10 из 40
6Дан код:
```python
a = {1, 2, 3}
b = a.copy()
a.add(4)
```
Что будет в `b`?
AОба множества изменятся: и в `a`, и в `b` появится `4`
BТолько в `a` добавится `4`, а `b` останется `{1, 2, 3}`
CБудет ошибка, потому что множества нельзя копировать методом `.copy()`
DТолько в `b` добавится `4`, а `a` останется `{1, 2, 3}`
Ответ: `.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}` — значение из `d2` перезапишет значение из `d1`
CСловарь `{'a': 1, 'b': 2, 'c': 4}` — значение из `d1` имеет приоритет
DБудет `TypeError`, потому что оператор `|` не работает со словарями
Ответ: Оператор `|` объединяет словари; при совпадении ключей значения из правого словаря перезаписывают левый.
Начиная с 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` — это `list`, элементы которого — объекты `dict`. Сначала берём элемент по индексу `users[0]`, получая словарь `{'name': 'Анна', 'age': 25}`. Затем обращаемся по ключу `['name']`. Обращение `users['name']` вызовет `TypeError`, потому что индекс списка должен быть целым числом, а не строкой.
10После выполнения кода `lst = [1, 2]; lst.append([3, 4])` чему равно `lst`?
A`[1, 2, 3, 4]`
B`[1, 2]`
C`[3, 4, 1, 2]`
D`[1, 2, [3, 4]]`
Ответ: `.append()` добавляет один элемент в конец `list`, даже если этот элемент — другой список.
Метод `.append(x)` добавляет ровно один элемент `x`. Поэтому `.append([3, 4])` добавит список как единый элемент, и получится вложенная структура. Если нужно добавить элементы по одному из списка, используют `.extend([3, 4])`.
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram