Autor
|
Tema: Python - Comprensión de listas vs map/filter (duda) (Leído 3,754 veces)
|
tzinm
Desconectado
Mensajes: 2
|
¡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: [x ** 2 for x in range(10) if x % 2 == 0] Podemos utilizar map y filter para conseguir lo mismo: list(map((lambda x: x ** 2), filter((lambda x: x % 2 == 0), range(10)))) El resultado obtenido es el mismo en ambos casos: Si pasamos a una comprensión de lista más "compleja" para encontrar su equivalente con las utilidades map y filter. [(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: [(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)] Obtenemos este mismo resultado si utilizamos el clásico loop for. 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
Mensajes: 162
|
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í: numeros = [0,1,2,3,4,5]; pares = list( filter(lambda x: x % 2 == 0 ) ); impares = list( filter(lambda y: y % 2 == 1 ) );
Con map: numeros = [0,1,2,3,4,5]; pares = list( map(lambda x: x % 2 == 0), numeros ); impares = list( map(lambda y: y % 2 == 1), numeros );
|
|
« Última modificación: 31 Julio 2021, 18:23 pm por Locura_23 »
|
En línea
|
|
|
|
TheMaxjs2
Desconectado
Mensajes: 2
|
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
Mensajes: 2
|
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í: numeros = [0,1,2,3,4,5]; pares = list( filter(lambda x: x % 2 == 0 ) ); impares = list( filter(lambda y: y % 2 == 1 ) );
Con map: numeros = [0,1,2,3,4,5]; pares = list( map(lambda x: x % 2 == 0), numeros ); impares = list( map(lambda y: y % 2 == 1), numeros );
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í: [(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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Comprensión de lista en python
Scripting
|
Joe Fraddy
|
2
|
2,825
|
18 Febrero 2015, 00:15 am
por Joe Fraddy
|
|
|
Invertir claves de un diccionario por comprensión en python.
Scripting
|
jam man
|
5
|
5,089
|
10 Octubre 2015, 23:09 pm
por jam man
|
|
|
MOVIDO: Invertir claves de un diccionario por comprensión en python.
Programación General
|
Eleкtro
|
0
|
1,787
|
22 Septiembre 2015, 10:30 am
por Eleкtro
|
|
|
Obtener el número mayor con comprensión de listas en Python.
Scripting
|
El mas antiguo
|
9
|
3,998
|
10 Octubre 2022, 20:55 pm
por El mas antiguo
|
|
|
Error de comprensión de la lista de Python: resultado inesperado
Scripting
|
adhar2
|
1
|
3,886
|
29 Agosto 2023, 14:53 pm
por reymosquito
|
|