← Все вопросы

Чем map и filter отличаются от list comprehension и что читаемее?

Задан 2 месяца назад535 просмотров3 ответа
8

Одно и то же можно записать через map/filter и через списковое включение:

list(map(lambda x: x*2, nums))
[x*2 for x in nums]

В чём разница на самом деле и что предпочесть в обычном коде?

3 ответа

19

Результат одинаковый, разница в стиле и мелких деталях. map/filter возвращают ленивый итератор (его надо обернуть в list(), чтобы увидеть), а comprehension сразу строит список. Когда внутри нужна lambda, comprehension почти всегда читаемее:

# фильтр + преобразование в одну строку
[x*2 for x in nums if x > 0]

# через map+filter то же самое выглядит громоздко
list(map(lambda x: x*2, filter(lambda x: x > 0, nums)))

В официальном стиле Python comprehension предпочтительнее, когда есть lambda. А вот map(str, nums) с готовой функцией без lambda — коротко и нормально.

Богдан Соболев map с уже готовой функцией (map(int, parts)) — единственный случай, где он реально лаконичнее · 2 месяца назад
8

В обычном коде бери comprehension — читаемее и не нужен list(). map/filter оставь для случаев с готовой функцией (map(int, parts)).

-4

map быстрее работает всегда, поэтому он лучше.

Эльвира Козлова Это не так: для случая с lambda map не быстрее, а часто медленнее из-за вызова функции на каждый элемент. Разница вообще обычно незначима · 2 месяца назад

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект