List comprehensions, dict comprehensions, map, filter, zip, enumerate — идиоматический Python, который ожидают от аналитика. На собеседовании просят переписать цикл в comprehension, использовать sorted с ключом или объяснить разницу между map и генератором списка. Владение этими конструкциями показывает зрелость как Python-разработчика.
При итерации по словарю Python отдаёт его ключи, поэтому `max(rev, key=rev.get)` сравнивает имена кампаний по значению выручки и возвращает «лучшее» имя — что и нужно. `max(rev.keys(), key=str)` сравнивает ключи как строки и игнорирует выручку. `max(list(rev.values()))` вернёт максимальное число, а не имя кампании. `max(rev.items(), key=str)` сравнивает кортежи `(ключ, значение)` лексикографически и тоже не учитывает выручку как число.
Подробный разбор →Вызов `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` найдёт товар с алфавитно первым именем, а не с минимальной ценой.
Подробный разбор →`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()` — действительно уместна.
Подробный разбор →`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`.
Подробный разбор →Для словаря `id -> amount` нужно явно задать пары `o['id']: o['amount']` и оставить только заказы с `amount > 0`. Списочное включение с кортежами вернёт список пар, а не словарь. Конструкция в фигурных скобках без двоеточия создаёт множество пар, а не словарь. Вариант `{o['id']: o for ...}` кладёт в значение целиком сам заказ, а нам нужна только сумма.
Подробный разбор →В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать Python в Telegram