Python: mapear, filtrar, reducir

Mar 06 2023
MAP Primero, comprendamos por qué necesitamos exactamente una función de mapa y cómo nos ayuda a reducir nuestro trabajo y hacer que nuestro código sea más eficiente. Supongamos que tenemos una lista para trabajar como se muestra a continuación, pero el problema con la lista es que todos los elementos presentes en ella están en formato de cadena, por lo que si intentamos realizar operaciones numéricas, no arrojará ningún resultado.

MAPA

Primero, comprendamos por qué necesitamos exactamente una función de mapa y cómo nos ayuda a reducir nuestro trabajo y hacer que nuestro código sea más eficiente.

Supongamos que tenemos una lista para trabajar como se muestra a continuación, pero el problema con la lista es que todos los elementos presentes en ella están en formato de cadena, por lo que si intentamos realizar operaciones numéricas, no arrojará ningún resultado.

l1 = ["3","5","9","12","25"]
x = l1[0]+1
print(x)
----------------------------------------------------------------------
-----
TypeError Traceback (most recent call
last)
Input In [1], in <cell line: 2>()
1 l1 = ["3","5","9","12","25"]
----> 2 x = l1[0]+1
3 print(x)
TypeError: can only concatenate str (not "int") to str

Ahora, una forma de evitar esto es un bucle for, echemos un vistazo

for i in range(len(l1)):
l1[i] = int(l1[i])

x = l1[0]+1
print(x)
4

Tomaremos otra lista llamada l2 y volveremos a realizar la misma operación.

l2 = ["3","5","9","12","25"]
l2 = list(map(int,l2))
y = l2[0]+1
print(y)
4

Ahora echemos un vistazo a algunos otros ejemplos también, supongamos que queremos encontrar los valores cuadrados de una lista completa, veamos cómo podemos hacerlo con la ayuda de la función de mapa.

Primero, escribamos una función 'sq' que devolverá el valor al cuadrado de un número dado

def sq(a):
  return a*a

l3 = [3,5,7,2,9]
l4 = list(map(sq,l3))
print(l4)
[9, 25, 49, 4, 81]

Ahora veamos algo más complicado, lo que estamos tratando de lograr ahora es obtener el cuadrado y el cubo de los números desde 0,8, almacenados en una lista. Usaremos la función de mapa, la función lambda y también nuestra palabra clave def para describir las funciones de cuadrado y cubo ahora. Luego usaremos un ciclo for para crear la lista.

def sq(a):
  return a*a
def cube(a):
  return a*a*a
func = [sq,cube]
for i in range(8):
  rslt = list(map(lambda x:x(i) ,func))
print(rslt)
[0, 0]
[1, 1]
[4, 8]
[9, 27]
[16, 64]
[25, 125]
[36, 216]
[49, 343]

Como sugiere el nombre, la función de filtro nos ayuda a filtrar un conjunto determinado de iterables, como argumento toma la función establecida en función de la cual filtraremos nuestros iterables y luego toma los propios iterables como argumentos. A continuación se dan 3 tipos de filtros, uno filtrará números mayores a 10 de la lista, otro filtrará números menores a 10 y uno tendrá condicionamiento múltiple que establece que el número debe ser mayor a 10 pero menor a 15.

l1 = [34,12,5,8,11,14,19,10,1,50]
def grt_condi(num):
  return num>10
def lsr_condi(num):
  return num<10
def multi_condi(num):
  return num>10 and num<15

l2 = list(filter(grt_condi,l1))
l3 = list(filter(lsr_condi,l1))
l4 = list(filter(multi_condi,l1))

print(l2)
print(l3)
print(l4)
[34, 12, 11, 14, 19, 50]
[5, 8, 1]
[12, 11, 14]

Entendamos qué hace la función reduce y qué problema resuelve, para entender esto, primero tomemos una declaración del problema y nuestro recorrido tradicional para resolverlo.

Digamos que hay una lista y queremos obtener la suma de todos los números enteros presentes en la lista

l6 = [2,3,6,5,8,9,10]
x = 0
for i in l6:
  x = x+i
print(x)
43

from functools import reduce
l7 = reduce(lambda x,y:x+y , l6)
print(l7)
43

Para obtener más contenido de este tipo, siga mi perfil de Medium y mi página de LinkedIn:https://www.linkedin.com/in/chandan-sengupta/