Historia de la cuestión
La función map() proviene de la programación funcional (incluso de Lisp), su propósito es aplicar una función a cada elemento de una secuencia devolviendo un nuevo objeto iterable con los resultados. En Python, apareció mucho antes de la llegada de las comprensiones de generadores y listas, pero sigue siendo ampliamente utilizada, especialmente en grandes pipelines de procesamiento de datos.
Problema
Si se necesita modificar cada elemento de una colección según alguna regla, las soluciones basadas en bucles for rápidamente se vuelven voluminosas y menos legibles. Las comprensiones de listas y map() permiten expresar la intención de manera compacta. Es importante entender las diferencias entre estos enfoques para elegir correctamente la herramienta.
Solución
map(func, iterable) crea un iterador perezoso en el que los elementos de la secuencia original son transformados por la función funcmap no calcula los elementos de inmediato, sino que trabaja de manera perezosadef square(x): return x * x squares = map(square, [1, 2, 3]) print(list(squares)) # [1, 4, 9]
La comprensión de listas [square(x) for x in [1, 2, 3]] hace lo mismo, pero devuelve inmediatamente una lista, mientras que la expresión generadora (square(x) for x in [1, 2, 3]) es un generador perezoso.
Características clave:
¿Devuelve map() una lista en Python 3?
No, a partir de Python 3, map() no devuelve una lista, sino un iterador perezoso. Para obtener una lista, se debe envolver manualmente el resultado en list().
res = map(str.upper, ['a', 'b']) print(res) # <map object ...> print(list(res)) # ['A', 'B']
¿Se puede añadir una condición de filtrado dentro de la función usando map()?
No, map() no filtra elementos, solo transforma. Para el filtrado, use filter() o una comprensión de listas:
result = map(str.upper, ['a', 'b', None]) # Si llega None, map lanzará un error al llamar str.upper(None) # filter ayudará a eliminar None antes de map
¿Se puede recorrer simultáneamente dos secuencias usando map()?
Sí, map() puede aceptar una cantidad arbitraria de secuencias, y la función transformadora debe aceptar la misma cantidad de argumentos:
x = [1, 2, 3] y = [10, 20, 30] result = map(lambda a, b: a + b, x, y) print(list(result)) # [11, 22, 33]
El desarrollador espera recibir una lista de inmediato:
mapped = map(abs, [-1, -2, -3]) print(mapped[1]) # TypeError: 'map' object is not subscriptable
Pros:
Contras:
Uso de una comprensión generadora para filtrar y map() para transformar:
nums = range(-5, 6) positives = (x for x in nums if x > 0) sq = map(lambda n: n * n, positives) print(list(sq)) # [1, 4, 9, 16, 25, 36]
Pros:
Contras: