Генераторы списков и встроенные функции: вопросы для собеседования (часть 4)
List comprehensions, dict comprehensions, map, filter, zip, enumerate — идиоматический Python, который ожидают от аналитика. На собеседовании просят переписать цикл в comprehension, использовать sorted с ключом или объяснить разницу между map и генератором списка. Владение этими конструкциями показывает зрелость как Python-разработчика.
Вопросы 16–20 из 20
16Есть словарь выручки по кампании `rev = {"A": 100, "B": 250, "C": 180}`. Нужно получить название кампании с максимальной выручкой. Что правильно?
A`max(rev)`
B`max(rev.values())`
C`rev.max()`
D`max(rev, key=rev.get)`
Ответ: Чтобы найти ключ по максимальному значению в `dict`, используйте `max(d, key=d.get)`.
`max(rev)` сравнивает ключи словаря и возвращает максимальный ключ по порядку сравнения строк, а не по выручке. `max(rev.values())` вернёт максимальную выручку (число), но не название кампании. Выражение `max(rev, key=rev.get)` говорит: «верни тот ключ, у которого значение `rev.get(key)` максимально».
17Есть список словарей `products` с ключами `name` и `price`. Нужно получить `name` самого дешёвого товара. Какой код корректен?
A`min(p["price"] for p in products)`
B`sorted(products, key=lambda p: p["price"])[0]`
C`min(products, key=lambda p: p["price"])["name"]`
D`min(products, key=lambda p: p["name"])["name"]`
Ответ: Чтобы выбрать объект с минимальным значением поля, используйте `min(iterable, key=...)`, а затем возьмите нужное поле.
Вариант `min(products, key=lambda p: p["price"])` выбирает словарь товара с минимальной ценой, и затем можно взять его `"name"`. Вариант `min(p["price"] for p in products)` вернёт только минимальную цену (число), а `sorted(...)[0]` вернёт весь словарь, но не извлечёт `name`.
18Где использование `lambda` обычно оправдано и не ухудшает читаемость?
A`list(map(lambda x: x * 2, items))`
B`list(filter(lambda x: x > 0, items))`
C`any(map(lambda x: x > 0, items))`
D`sorted(users, key=lambda u: u["last_login"])`
Ответ: Короткая `lambda` часто уместна в `sorted()` (и в `min()`/`max()`) для параметра `key=`, когда функция нужна один раз.
Использование `lambda` внутри `map()`/`filter()` часто ухудшает читаемость: приходится держать в голове сразу и логику, и вложенные вызовы. Для `key=` в `sorted()` короткая `lambda` обычно воспринимается нормально, потому что она локально объясняет, по какому полю сортировать.
19Есть список словарей `orders` с ключами `id` и `amount`. Как получить сам заказ (словарь) с максимальным `amount`?
A`max(o["amount"] for o in orders)`
B`max(orders, key=lambda o: o["amount"])`
C`max([o["amount"] for o in orders])`
D`sorted(orders, key=lambda o: o["amount"])[-1]["amount"]`
Ответ: `max()` может возвращать целый объект, если передать `key=` — функцию, которая говорит, по какому значению сравнивать.
Если нужно получить не максимальное число, а сам объект (например, весь заказ), используйте `max(orders, key=lambda o: o["amount"])`. Варианты, которые берут `max(...)` по `amount`, возвращают только число, а не словарь заказа.
20Есть список заказов `orders`, каждый элемент — словарь с ключами `id` и `amount`. Нужно собрать словарь `id -> amount` только для заказов с `amount > 0`. Какой код корректен?
A`dict(orders)`
B`{(o["id"], o["amount"]) for o in orders if o["amount"] > 0}`
C`{o["id"]: o["amount"] for o in orders if o["amount"] > 0}`
D`{o["id"]: o for o in orders if o["amount"] > 0}`
Ответ: Dict comprehension имеет форму `{key: value for ... if ...}` и позволяет сразу описать и фильтрацию, и построение словаря.
Вариант `{o["id"]: o["amount"] for o in orders if o["amount"] > 0}` создаёт нужное соответствие ключ → значение. Вариант с множеством `{(...), ...}` даёт `set`, а не `dict`. Вариант `{o["id"]: o ...}` сохраняет весь объект заказа, а не поле `amount`.
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram