xticks barplot python functional-programming map-function filterfunction

python - barplot - pandas plot



Python: diferencia entre filtro(función, secuencia) y mapa(función, secuencia) (5)

Función de filtro (función, iterable) (puntero, como en C) devuelve tipo booleano

función map (function, iterable) (puntero, como en C) return eg int

def filterFunc(x): if x & 1 == 0: return False return True def squareFunc(x): return x ** 2 def main(): nums = [5, 2, 9, 4, 34, 23, 66] odds = list(filter(filterFunc, nums)) # filter(function, iterable) print(odds) square = list(map(squareFunc, nums)) # map(function, iterable) print(square) if __name__ == ''__main__'': main()

Estoy leyendo la documentación de Python para realmente profundizar en el lenguaje Python y encontré las funciones de filtro y mapa. He usado el filtro antes, pero nunca el mapa, aunque he visto ambas en varias preguntas de Python aquí en SO.

Después de leer sobre ellos en el tutorial de Python, estoy confundido sobre la diferencia entre los dos. Por ejemplo, a partir de 5.1.3. Herramientas de programación funcional :

>>> def f(x): return x % 2 != 0 and x % 3 != 0 ... >>> filter(f, range(2, 25)) [5, 7, 11, 13, 17, 19, 23]

y

>>> def cube(x): return x*x*x ... >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

A mí me parecían casi exactamente iguales en función, así que entré en el terminal para ejecutar Python de forma interactiva y probé mi propio caso. Usé el map para la primera y la segunda instancia de arriba, y para la primera ( return x % 2 != 0 and x % 3 != 0 ) devolvió una lista de valores booleanos en lugar de números.

¿Por qué el map veces devuelve un valor booleano y otras veces el valor de retorno real?

¿Puede alguien explicarme exactamente la diferencia entre map y filter ?


filter() , como su nombre lo indica, filtra el iterable original y vuelve a almacenar los elementos que devuelven True para la función proporcionada para filter() .

map() por otro lado, aplique la función suministrada a cada elemento del iterable y devuelva una lista de resultados para cada elemento.

Sigue el ejemplo que diste, comparémoslo:

>>> def f(x): return x % 2 != 0 and x % 3 != 0 >>> range(11) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> map(f, range(11)) # the ones that returns TRUE are 1, 5 and 7 [False, True, False, False, False, True, False, True, False, False, False] >>> filter(f, range(11)) # So, filter returns 1, 5 and 7 [1, 5, 7]


map y filter en Python es bastante diferente porque tienen un rendimiento muy diferente. Tengamos un ejemplo rápido para diferenciarlos.

función de mapa

Definamos una función que tome un argumento de cadena y compruebe si se presenta en secuencias de letras vocales.

def lit(word): return word in ''aeiou''

Ahora vamos a crear una función de mapa para esto y pasar una cadena aleatoria.

for item in map(lit,[''a'',''b'',''e'']): print(item)

Y sí es equivalente a seguir

lit(''a'') , lit(''b'') , lit(''e'')

simplemente se imprimirá

True False True

función de filtro

Ahora vamos a crear una función de filter para esto y pasar una cadena aleatoria.

for item in filter(lit,[''a'',''b'',''e'']): print(item)

filter como su nombre lo indica, filtra el iterable original y vuelve a almacenar los elementos que devuelven True para la función proporcionada a la función de filtro.

Simplemente se imprimirá

a e

Búscalo here para futuras referencias, si encuentras esto útil.


Filtro - Devuelve la posición del verdadero valor.

var_list = [10,20,0,1] var_b = list(filter(lambda var_a : var_a*2,var_list)) print("Values are",var_b)

Salida

Los valores son [10, 20, 1]

Mapa - Devuelve el resultado real

var_list = [10,20,0,1] var_b = list(map(lambda var_a : var_a*2,var_list)) print("Values are",var_b)

Salida

Los valores son [20, 40, 0, 2]

Reducir: tome los primeros 2 elementos de la lista, luego las llamadas funcionan. En la siguiente llamada de función, el resultado de la llamada anterior será el primer argumento y el tercer elemento en la lista será el segundo argumento

from functools import * var_list = [10,20,0,1] var_b = list(map(lambda var_a : var_a*2,var_list)) print("Values of var_b ",var_b) var_c = reduce(lambda a,b:a*2,var_b) print("Values of var_c",var_c)

Salida

Valores de var_b [20, 40, 0, 2]

Valores de var_c 160


list(map(cube, range(1, 11)))

es equivalente a

[cube(1), cube(2), ..., cube(10)]

Mientras que la lista regresó por

list(filter(f, range(2, 25)))

es equivalente al result después de correr

result = [] for i in range(2, 25): if f(i): result.append(i)

Tenga en cuenta que al usar el map , los elementos del resultado son valores devueltos por el cube funciones.

En contraste, los valores devueltos por f en el filter(f, ...) no son los elementos en el result . f(i) solo se utiliza para determinar si el valor i debe mantenerse en el result .

En Python2, map y filter listas de retorno. En Python3, mapee y filter iteradores de retorno. Arriba, la list(map(...)) y la list(filter(...)) se utilizan para asegurar que el resultado sea una lista.