Генераторы списков и встроенные функции: вопросы для собеседования (часть 3)

List comprehensions, dict comprehensions, map, filter, zip, enumerate — идиоматический Python, который ожидают от аналитика. На собеседовании просят переписать цикл в comprehension, использовать sorted с ключом или объяснить разницу между map и генератором списка. Владение этими конструкциями показывает зрелость как Python-разработчика.

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

Вопросы 1115 из 20

11В данных пользователей поле города может быть отсутствующим. Нужно получить множество уникальных городов в нижнем регистре, пропуская `None`. Какой вариант подходит?
A`[u["city"].lower() for u in users if u.get("city")]`
B`set([u["city"] for u in users])`
C`{u["city"] for u in users}`
D`{u["city"].lower() for u in users if u.get("city")}`
Ответ: Set comprehension `{expr for ...}` помогает одновременно преобразовать значения и убрать дубликаты, а `if` — пропустить пустые.

Если задача — именно множество уникальных значений, set comprehension часто самый прямой вариант. Условие `if u.get("city")` отбрасывает отсутствующие или пустые значения, а `.lower()` приводит к единому виду, чтобы `"Moscow"` и `"moscow"` не считались разными городами.

12Есть словарь `code_to_name = {"RU": "Russia", "FR": "France"}`. Нужно получить обратное отображение `name_to_code` (предполагаем, что значения уникальны). Какой вариант корректен?
A`{v: k for k, v in code_to_name.items()}`
B`{k: v for k, v in code_to_name.items()}`
C`dict(code_to_name.items())`
D`list(code_to_name.items())`
Ответ: Через `.items()` удобно взять пары ключ-значение и поменять их местами в dict comprehension.

В выражении `{v: k for k, v in code_to_name.items()}` мы явно меняем местами ключ и значение: новый ключ — это старое значение `v`, а новое значение — старый ключ `k`. Важно, чтобы значения были уникальны, иначе при инвертировании ключи начнут перезаписываться.

13Есть список email `emails = ["a@x.com", "b@y.com", "c@x.com"]`. Нужно получить множество доменов (часть после `@`). Какой вариант корректен?
A`{e.split("@")[0] for e in emails}`
B`{e.split("@")[1] for e in emails}`
C`[e.split("@")[1] for e in emails]`
D`set(emails)`
Ответ: Set comprehension позволяет извлечь домен из каждой строки и автоматически убрать дубликаты.

Выражение `{e.split("@")[1] for e in emails}` берёт часть после `@` для каждого email. Результат — `set`, поэтому повторяющиеся домены (например, `"x.com"`) автоматически схлопываются в один элемент.

14Есть список словарей `users`, где у некоторых пользователей отсутствует email (например, `u.get("email")` возвращает `None`). Нужно получить список email в нижнем регистре, пропуская отсутствующие. Какой вариант обычно наиболее читаемый?
A`list(map(lambda u: u["email"].lower(), filter(lambda u: u.get("email"), users)))`
B`[u["email"].lower() for u in users if u.get("email")]`
C`any(u.get("email") for u in users)`
D`{u["email"].lower() for u in users if u.get("email")}`
Ответ: Комбинация фильтрации и преобразования часто читается проще в одной list comprehension, чем через вложенные `map()`/`filter()` с `lambda`.

List comprehension сразу показывает намерение: «возьми email и приведи к нижнему регистру для каждого пользователя, у которого есть email». Вариант с `map()` и `filter()` плюс два `lambda` усложняет чтение: приходится разбирать вложенные вызовы, чтобы понять порядок действий.

15Дан список батчей `batches = [[101, 102], [], [103]]`. Что вернёт выражение `[x for batch in batches for x in batch]`?
A`[[101, 102], [], [103]]`
B`[101, 102, [], 103]`
C`[101, 102, 103]`
D`[101, 102]`
Ответ: Несколько `for` в list comprehension эквивалентны вложенным циклам и часто используются для «сплющивания» списка списков.

Конструкция `[x for batch in batches for x in batch]` означает: сначала перебираем каждый `batch` из `batches`, затем перебираем элементы `x` внутри `batch`. Пустой список `[]` просто не добавляет элементов в результат.

1234

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

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

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

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

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