Коллекции и структуры данных: вопросы для собеседования (часть 5)
Списки, словари, множества, кортежи — базовые структуры данных Python, без которых не обойтись ни в анализе, ни на собеседовании. Спрашивают про сложность операций, разницу между list и tuple, когда использовать set вместо list. Понимание коллекций показывает, что кандидат пишет эффективный код, а не просто «работающий».
Вопросы 21–25 из 40
21Есть список чисел `values = [100, 50, 50]` (список не пустой). Как посчитать среднее значение?
A`sum(values) / len(values)`
B`len(values) / sum(values)`
C`values.sum() / values.len()`
D`avg(values)`
Ответ: Среднее значение считается как `sum(values) / len(values)`.
`sum(values)` складывает элементы, а `len(values)` возвращает количество элементов в `list`. Для среднего нужно разделить сумму на количество. Если список может быть пустым, обычно добавляют проверку `len(values) > 0` перед делением.
22Есть список из 100 000 заблокированных `user_id` в переменной `banned`. Для каждого из миллиона событий нужно проверить, заблокирован ли пользователь. Как ускорить проверку?
AПреобразовать `banned` в `tuple` — проверка `in` у кортежей быстрее, чем у списков
BОставить `list` и использовать `bisect` — бинарный поиск быстрее полного перебора
CПреобразовать `banned` в `set` — проверка `in` у множества работает за O(1)
DОтсортировать `list` — тогда `in` автоматически использует бинарный поиск
Ответ: Проверка `x in set` работает за O(1) в среднем, а `x in list` — за O(n). Для массовых проверок множество значительно быстрее.
Список проверяет принадлежность последовательным перебором элементов — O(n). Множество использует хеш-таблицу, поэтому проверка `x in s` занимает O(1) в среднем. При 100 000 элементах и миллионе проверок разница огромна. Сортировка списка не помогает: оператор `in` у `list` не использует бинарный поиск — он всегда делает линейный перебор.
23Есть список словарей:
```python
users = [
{'name': 'Анна', 'age': 30},
{'name': 'Борис', 'age': 25}
]
```
Как отсортировать его по возрасту?
A`sorted(users, key='age')` — передать имя ключа строкой
B`.sort(users, key=lambda u: u['age'])` — вызвать как функцию модуля
C`.users.sort_by('age')` — использовать встроенный метод списка словарей
D`sorted(users, key=lambda u: u['age'])` — передать функцию извлечения ключа
Ответ: Параметр `key` в `sorted()` принимает функцию, которая извлекает значение для сортировки из каждого элемента.
Вызов `sorted(users, key=lambda u: u['age'])` создаст новый список, отсортированный по значению ключа `'age'`. Функция `lambda u: u['age']` вызывается для каждого элемента и возвращает число, по которому идёт сортировка. Передать строку `'age'` напрямую нельзя — `key` ожидает вызываемый объект. Альтернатива лямбде — `operator.itemgetter('age')` из стандартной библиотеки.
24Есть множество `s = {"a", "b"}`. Нужно удалить элемент `"c"`, если он есть, и не получать ошибку, если его нет. Какой способ корректен?
A`s.remove("c")`
B`del s["c"]`
C`s.discard("c")`
D`s.pop("c")`
Ответ: `.discard()` удаляет элемент без ошибки, даже если элемента нет.
Метод `.remove("c")` выбросит `KeyError`, если элемента нет. `.discard("c")` безопасен: он удалит элемент при наличии и ничего не сделает при отсутствии. У `set` нет индексации, поэтому `del s["c"]` не работает. `.pop()` у `set` не принимает аргумент и удаляет произвольный элемент.
25Есть список названий кампаний `campaigns` с повторами. Нужно получить список уникальных кампаний в отсортированном виде. Какой вариант корректен?
A`set(sorted(campaigns))`
B`sorted(campaigns)`
C`set(campaigns)`
D`sorted(set(campaigns))`
Ответ: Частый приём: сначала `set()` для уникальности, затем `sorted()` для получения отсортированного списка.
`set(campaigns)` удалит повторы, но вернёт `set`, порядок которого не стоит использовать как «отсортированный». `sorted(campaigns)` отсортирует, но оставит дубликаты. `sorted(set(campaigns))` удаляет повторы и возвращает новый отсортированный `list`.
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram