Sustituir ciclos con map, filter y reduce.
Posted on vie 07 febrero 2020 in Tutorial de Python • 5 min read
Este artículo se basa en el artículo en medium, How To Replace Your Python For Loops with Map, Filter, and Reduce.
El artículo tendrá 3 faces, la primera será la de mostrar la lógica de los ejemplos usando ciclos, luego se usará list comprehension y por último map, filter y reduce.
Ciclos
En esta primera parte se generará una lista con 100 números (se que no es necesario un ciclo para generar está primera lista), luego a esa lista se calculará los números pares, luego se generará una lista con el cuadrado de los números generados al inicio y por último se calculará la suma total de los números de la última lista.
Generación de números en una lista
In [1]:
numeros = []
for i in range(0,100):
numeros.append(i)
print(numeros)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
Otra forma de hacerlo: In [2]:
numeros = list(range(100))
print(numeros)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
Filtrar números pares de la lista
In[3]:
numeros_pares = []
for numero in numeros:
if numero % 2 == 0:
numeros_pares.append(numero)
print(numeros_pares)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
Calcular el cuadrado de los números pares
In[4]:
numeros_pares_cuadrados = []
for numero in numeros_pares:
numeros_pares_cuadrados.append(numero ** 2)
print(numeros_pares_cuadrados)
[0, 4, 16, 36, 64, 100, 144, 196, 256, 324, 400, 484, 576, 676, 784, 900, 1024, 1156, 1296, 1444, 1600, 1764, 1936, 2116, 2304, 2500, 2704, 2916, 3136, 3364, 3600, 3844, 4096, 4356, 4624, 4900, 5184, 5476, 5776, 6084, 6400, 6724, 7056, 7396, 7744, 8100, 8464, 8836, 9216, 9604]
Calcular la suma total de los números pares pares
In[5]:
# calculate total
total = 0
for numero in numeros_pares_cuadrados:
total += numero
print(total)
161700
Usando list comprehension
Ahora se repitirán los cáculos usando list comprehension en vez de ciclos.
Filtrar números pares de la lista
In[6]:
numeros_pares = [numero for numero in numeros if numero % 2 == 0]
print(numeros_pares)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
Calcular el cuadrado de los números pares
In[7]:
numeros_pares_cuadrados = [numero ** 2 for numero in numeros_pares]
print(numeros_pares_cuadrados)
[0, 4, 16, 36, 64, 100, 144, 196, 256, 324, 400, 484, 576, 676, 784, 900, 1024, 1156, 1296, 1444, 1600, 1764, 1936, 2116, 2304, 2500, 2704, 2916, 3136, 3364, 3600, 3844, 4096, 4356, 4624, 4900, 5184, 5476, 5776, 6084, 6400, 6724, 7056, 7396, 7744, 8100, 8464, 8836, 9216, 9604]
Calcular la suma total de los números pares pares
In[8]:
# calculate total
total = sum([numero for numero in numeros_pares_cuadrados])
print(total)
161700
Usando map, filter y reduce
Definiciones
- map: Aplicar el mismo conjunto de pasos a cada elemento, almacenando el resultado. map(función,lista)
- filter: aplicar criterio de validación y almacene elementos que evalúen True ese criterio. filter(función,lista)
- reduce: devuelve un valor que se pasa de un elemento a otro. reduce(función,lista)
Para el caso de la función que se le pasa es necesario mencionar que se usará a lambda.
Acá coloco un ejemplo sencillo de lambda que calcula la suma de dos números: In[9]:
suma = lambda x,y: x+y
print(suma(1,2))
3
Filtrar números pares de la lista
Se tiene un lambda que se le pasa de argumento x, y se evalua si es un número par, a filter se le pasa el lambda y la lista de números a filtrar.
In[10]:
numeros_pares = list(filter(lambda x: (x % 2 == 0), numeros))
print(numeros_pares)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
Calcular el cuadrado de los números pares
En este caso se usa map, el cual se tiene un lambda que tiene de argumento x, y se calcula el cuadrado de x, a map se le pasa la lista de números pares.
In[11]:
numeros_pares_cuadrados = list(map(lambda x: (x ** 2), numeros_pares))
print(numeros_pares_cuadrados)
[0, 4, 16, 36, 64, 100, 144, 196, 256, 324, 400, 484, 576, 676, 784, 900, 1024, 1156, 1296, 1444, 1600, 1764, 1936, 2116, 2304, 2500, 2704, 2916, 3136, 3364, 3600, 3844, 4096, 4356, 4624, 4900, 5184, 5476, 5776, 6084, 6400, 6724, 7056, 7396, 7744, 8100, 8464, 8836, 9216, 9604]
Calcular la suma total de los números pares pares
Para este caso se tiene que importar reduce de la biblioteca functools.
El lambda requiere un acumulador y un valor n, la cual se suman. A reduce se le pasa el lambda y la lista de números pares cuadrados.
In[12]:
from functools import reduce
total = reduce(lambda acc, n: acc + n, numeros_pares_cuadrados)
print(total)
161700
Como se muestra en la serie de ejemplos, puede ser innecesario, dependiendo del caso que se necesite usar for o while para crear una lista o tener un resultado de una lista, se puede usar list comprehension o filter, map y reduce. Esto hace que pueda ser más rápido el código que se esté desarrollando.
¡Haz tu donativo! Si te gustó el artículo puedes realizar un donativo con Bitcoin (BTC) usando la billetera digital de tu preferencia a la siguiente dirección: 17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV
O Escaneando el código QR desde la billetera: