elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Python - Comprensión de listas vs map/filter (duda)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Python - Comprensión de listas vs map/filter (duda)  (Leído 3,731 veces)
tzinm

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Python - Comprensión de listas vs map/filter (duda)
« en: 29 Julio 2021, 21:11 pm »

¡Hola!

Parece que me voy a estrenar con mi primer mensaje, aunque no me gusta la idea de que sea para realizar una consulta...

Voy a ello. Estoy con el libro "Learning Python" en el tema Iterations and Comprehensions, Part 2. Para entender mejor la comprensión de listas hace varias comparaciones con utilidades como map y filter.

Veamos un ejemplo de los que nos encontramos en el libro:

Queremos crear una lista que se el cuadrado de los números pares entre el 0 y el 9 (ambos incluidos). Partiendo de la siguiente comprensión de lista:

Código:
[x ** 2 for x in range(10) if x % 2 == 0]

Podemos utilizar map y filter para conseguir lo mismo:

Código:
list(map((lambda x: x ** 2), filter((lambda x: x % 2 == 0), range(10))))

El resultado obtenido es el mismo en ambos casos:

Código:
[0, 4, 16, 36, 65]

Si pasamos a una comprensión de lista más "compleja" para encontrar su equivalente con las utilidades map y filter.

Código:
[(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]

Obteniendo como resultado una lista de tuplas:

Código:
[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

Obtenemos este mismo resultado si utilizamos el clásico loop for.

Código:
resultado = []
for x in range(5):
     if x % 2 == 0:
         for y in range(5):
             if y % 2 == 1:
                 resultado.append((x,y))

¿Se os ocurre cuál sería el equivalente de esta comprensión de lista con las utilidades map y filter?


En línea

Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Re: Python - Comprensión de listas vs map/filter (duda)
« Respuesta #1 en: 31 Julio 2021, 17:53 pm »

Tengo poca experiencia en Python, pero como nadie aún te ha respondido te dejo mi idea, creo que la lista deberia contener [0,1,2,3,4,5]
En el primer for recorres un rango de numeros del 0 al 5, donde tenes un if anidado, luego en ese if calculas el módulo de cada uno de los números  dentro del rango. Como lo igualas a cero, ahí vas a sacar todos los números pares.
En el segundo for haces lo mismo que en el anterior, pero el módulo está igualado a uno entonces, obtenes todos los números impares.

Luego con filter tal vez sea algo así:

Código
  1. numeros = [0,1,2,3,4,5];
  2. pares =  list( filter(lambda x: x % 2 == 0 )  );
  3. impares = list( filter(lambda y: y % 2 == 1 ) );
  4.  

Con map:

Código
  1. numeros = [0,1,2,3,4,5];
  2. pares = list( map(lambda x: x % 2 == 0),  numeros );
  3. impares = list( map(lambda y: y % 2 == 1), numeros );
  4.  


« Última modificación: 31 Julio 2021, 18:23 pm por Locura_23 » En línea

TheMaxjs2

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Python - Comprensión de listas vs map/filter (duda)
« Respuesta #2 en: 1 Agosto 2021, 00:15 am »

Me ha servido, de verdad necesitaba algunas explicaciones respecto a este tema y nunca se me habia pasado por la cabeza buscar esta formula para Python. Consulte en posicionamiento web y me dieron un ejemplo similar a este pero de verdad es que ambos me han salvado la vida. ¡Muchisimas gracias!
« Última modificación: 2 Agosto 2021, 20:33 pm por TheMaxjs2 » En línea

tzinm

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Python - Comprensión de listas vs map/filter (duda)
« Respuesta #3 en: 2 Agosto 2021, 23:50 pm »

Tengo poca experiencia en Python, pero como nadie aún te ha respondido te dejo mi idea, creo que la lista deberia contener [0,1,2,3,4,5]
En el primer for recorres un rango de numeros del 0 al 5, donde tenes un if anidado, luego en ese if calculas el módulo de cada uno de los números  dentro del rango. Como lo igualas a cero, ahí vas a sacar todos los números pares.
En el segundo for haces lo mismo que en el anterior, pero el módulo está igualado a uno entonces, obtenes todos los números impares.

Luego con filter tal vez sea algo así:

Código
  1. numeros = [0,1,2,3,4,5];
  2. pares =  list( filter(lambda x: x % 2 == 0 )  );
  3. impares = list( filter(lambda y: y % 2 == 1 ) );
  4.  

Con map:

Código
  1. numeros = [0,1,2,3,4,5];
  2. pares = list( map(lambda x: x % 2 == 0),  numeros );
  3. impares = list( map(lambda y: y % 2 == 1), numeros );
  4.  

En primer lugar, gracias por la respuesta :)

Cuando dices que la lista debería contener "[0, 1, 2, 3, 4, 5]" no sé si haces referencia a la función range que he utilizado (range(5)).

Si es así, a la función range cuando le pasamos únicamente un parámetro lo toma como el valor de "parada". Tal y como índica la documentación el valor de "parada" es omitido, por lo tanto la función range(5) devolvería una lista con los valores "[0, 1, 2, 3, 4]".

En lo que se refiere a la segunda parte de la respuesta, mi intención era buscar la forma de combinar los dos bloques de código que has publicado para tener una lista de tuplas tal que así:

Código:
[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

Se puede hacer de diferentes formas y con varias líneas de código, pero quería buscar la fórmula para hacer en una única línea de código mezclando las utilidades filter y map.

Lo dicho, gracias por la respuesta :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines