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.