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

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

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

Вопросы 1620 из 20

16Есть словарь выручки по кампании `rev = {"A": 100, "B": 250, "C": 180}`. Нужно получить название кампании с максимальной выручкой. Что правильно?
A`max(rev.keys(), key=str)`
B`max(list(rev.values()))`
C`max(rev.items(), key=str)`
D`max(rev, key=rev.get)`
Ответ: `max(rev, key=rev.get)` сравнивает ключи словаря по значениям, которые возвращает `rev.get`, и возвращает ключ с максимумом.

При итерации по словарю Python отдаёт его ключи, поэтому `max(rev, key=rev.get)` сравнивает имена кампаний по значению выручки и возвращает «лучшее» имя — что и нужно. `max(rev.keys(), key=str)` сравнивает ключи как строки и игнорирует выручку. `max(list(rev.values()))` вернёт максимальное число, а не имя кампании. `max(rev.items(), key=str)` сравнивает кортежи `(ключ, значение)` лексикографически и тоже не учитывает выручку как число.

Подробный разбор →
17Есть список словарей `products` с ключами `name` и `price`. Нужно получить `name` самого дешёвого товара. Какой код корректен и наиболее краток?
A`min([p["name"] for p in products if p["price"]])`
B`sorted(products, key=lambda p: p["price"])[0]`
C`min(products, key=lambda p: p["name"])["name"]`
D`min(products, key=lambda p: p["price"])["name"]`
Ответ: Чтобы выбрать объект с минимальным значением поля, используйте `min(iterable, key=...)`, а затем возьмите нужный ключ.

Вызов `min(products, key=lambda p: p["price"])` находит словарь товара с минимальной ценой, после чего из него можно достать поле `"name"`. Вариант `min(p["price"] for p in products)` вернёт только минимальную цену (число), а не имя. `sorted(...)[0]` вернёт целый словарь, но не извлекает `name` и работает за `O(n log n)` вместо `O(n)`. Сортировка с ключом по `name` найдёт товар с алфавитно первым именем, а не с минимальной ценой.

Подробный разбор →
18Где использование `lambda` обычно оправдано и не ухудшает читаемость?
A`list(map(lambda x: x * 2 + 1, items))`
B`list(filter(lambda x: x > 0 and x < 10, items))`
C`any(map(lambda x: x > 0 and x < 10, items))`
D`sorted(users, key=lambda u: u['last_login'])`
Ответ: Короткая `lambda` уместна как ключ сортировки или агрегации: одна строка локально объясняет, по какому полю работаем.

`sorted(users, key=lambda u: u['last_login'])` — типичный случай, где `lambda` действительно делает код короче и понятнее: вместо именования отдельной функции из одной строки. В вариантах с `map()`/`filter()`/`any()` те же операции лаконичнее выражаются через списочное включение или генератор: `[x * 2 + 1 for x in items]`, `[x for x in items if 0 < x < 10]` и `any(0 < x < 10 for x in items)`. Там `lambda` добавляет лишнюю обёртку, а в варианте с `sorted()` — действительно уместна.

Подробный разбор →
19Есть список словарей `orders` с ключами `id` и `amount`. Как получить сам заказ (словарь) с максимальным значением `amount`?
A`max(o["amount"] for o in orders)`
B`sorted(orders, key=lambda o: o["amount"])[-1]`
C`max(orders, key=lambda o: o["amount"])`
D`[o for o in orders if o["amount"] == max(orders)][0]`
Ответ: `max(orders, key=...)` возвращает сам элемент с максимумом по выбранному ключу, без сортировки и дополнительного перебора.

`max(orders, key=lambda o: o['amount'])` сравнивает заказы по полю `amount` и возвращает целиком тот словарь, у которого `amount` наибольший. `max(o['amount'] for o in orders)` возвращает только число, а не сам заказ. Сортировка списка с последующим взятием последнего элемента работает, но делает лишнюю работу за O(n log n) вместо O(n). Последний вариант пытается сравнить словарь с числом, что в Python 3 вообще приведёт к `TypeError`.

Подробный разбор →
20Есть список заказов `orders`, каждый элемент — словарь с ключами `id` и `amount`. Нужно собрать словарь `id -> amount` только для заказов с `amount > 0`. Какой код корректен?
A`[(o['id'], o['amount']) for o in orders if o['amount'] > 0]`
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}`
Ответ: Словарное включение `{ключ: значение for ... if ...}` создаёт словарь нужных пар, добавляя фильтр по сумме.

Для словаря `id -> amount` нужно явно задать пары `o['id']: o['amount']` и оставить только заказы с `amount > 0`. Списочное включение с кортежами вернёт список пар, а не словарь. Конструкция в фигурных скобках без двоеточия создаёт множество пар, а не словарь. Вариант `{o['id']: o for ...}` кладёт в значение целиком сам заказ, а нам нужна только сумма.

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

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

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

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

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

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