Hamburger Icon
Python: map, filter y reduce, todo lo que necesitas saber

Python: map, filter y reduce, todo lo que necesitas saber

José estaba en una entrevista de trabajo. A José le pidieron que filtrara una secuencia de números para obtener los que eran múltiplos de 3. José se quedó en blanco, sintió escalofríos. José no tuvo suerte en esa entrevista, pero le fue mejor en la siguiente, después de repasar estos conceptos que te traigo hoy.

En Python, cuando tenemos que procesar secuencias de datos, lo más común es aprovechar los métodos nativos map, filter y reduce.

Veamos antes que nada para qué sirven:

  • map: aplica una función a cada elemento de una secuencia y devuelve un iterador con los resultados
  • filter: crea un iterador que devuelve los elementos de una secuencia para los cuales la función dada retorna True
  • reduce: aplica repetidamente una función binaria (luego vemos qué es eso) a los elementos de una secuencia de forma acumulativa. Al final, devuelve un solo valor que representa la reducción de la secuencia

Si no sabes lo que es un iterable no te preocupes. Solo tienes que repasar un poco, te dejo aquí un artículo sobre iterables.

Vamos a ver ejemplos para entenderlo mejor estas funciones para procesar secuencias de datos.

Map

Si queremos aplicar una función a una serie de elementos de una secuencia, este es metodo que estamos buscando. Necesita dos parámetros: la función a aplicar y la secuencia de elementos.

Imagina que tienes una lista de valores numéricos y quieres saber el doble de cada uno de ellos:

# Función para multiplicar un número por 2
def nx2(x):
    return x * 2

# Secuencia de números
nums = [1, 2, 3, 4, 5]

# Aplicar la función a cada elemento de la secuencia utilizando map (devuelve un iterador)
res_it = map(nx2, nums)

# Convertir el resultado en una lista
res_list = list(res_it)

print(res_list)  # Salida: [2, 4, 6, 8, 10]

Como puedes ver, necesitas crear la función que quieres aplicar a cada elemento de la secuencia, aplicar el método map y finalmente convertir el iterador resultante en una lista de nuevo.

Filter

Útil para filtrar datos y quedarte solo con los elementos que te interese. Igual que antes, necesitaremos pasar dos argumentos, una función de comprobación y la secuencia de elementos para filtrar.

El típico ejemplo de filtrar los números pares:

# Función para filtrar números pares
def es_par(x):
    return x % 2 == 0

# Secuencia de números
nums = [1, 2, 3, 4, 5]

# Filtrar los números pares utilizando filter
res_it = filter(es_par, nums)

# Convertir el resultado en una lista
res_list = list(res_it)

print(res_list)  # Salida: [2, 4]

Reduce

Este método nos resultará muy útil cuando, a partir de un listado de elementos, queremos aplicar ciertos cálculos y conocer un valor acumulado. Tendremos que pasar como parámetros una función binaria y la secuencia de elementos.

Una función binaria es aquella que, a partir de dos valores, devuelve un resultado después de aplicar cierta lógica entre ellos.

Para usar reduce es necesario importar la función desde functools a partir de Python 3. Imagina que quieres conocer la suma de los números de una lista -suponiendo que no existe o no conoces el método sum-, entonces puedes hacer algo así:

from functools import reduce

# Función binaria para sumar dos números
def sumar(x, y):
    return x + y

# Secuencia de números
nums = [1, 2, 3, 4, 5]

# Reducción de la secuencia utilizando reduce
res = reduce(sumar, nums)

print(res)  # Salida: 15

En este caso devuelve directamente el resultado acumulado, no es necesario realizar ninguna conversión. En la primera iteración sumará los dos primeros valores de la lista, en la segunda iteración, sumará el resultado anterior con el tercer elemento de la lista, y así sucesivamente.

Este método puede resultar un poco más confuso, veamos otro ejemplo para encontrar el valor más alto:

# Utilizando la función binaria en reduce
from functools import reduce

# Función binaria para encontrar el máximo de dos números
def encontrar_maximo(x, y):
    return x if x > y else y

nums = [10, 5, 8, 12, 3]
maximo = reduce(encontrar_maximo, nums)

print(maximo)  # Salida: 12

En este ejemplo, en cada iteración, nos quedamos con el valor más grande hasta el momento, de modo que al final de pasar por todo el listado tendremos el valor máximo encontrado.

Conclusión

Los métodos map, filter y reduce nos pueden resultar muy útiles para mapear, filtrar y realizar reducciones sobre secuencias de datos. ¿Te quedas con ganas de conocer casos de uso un poco más reales? Pues estos son algunos, intenta pensar qué método usarías en cada caso:

  • convertir una lista de temperaturas en grados Celsius a Fahrenheit
  • concatenar una lista de cadenas en una sola cadena
  • eliminar elementos nulos o vacíos de una lista
  • calcular estadísticas básicas, como el promedio, la mediana o la desviación estándar de una lista numérica
  • convertir una cadena de caracteres en minúscula a mayúsculas

Aunque los ejemplos vistos son simples, es importante dominarlos porque tarde o temprano nos encontraremos con alguno de los casos de uso que requerirán que apliquemos estos recursos de forma más compleja.