python-3.x - funcion - python lambda function list comprehension
Cómo encontrar la longitud de un objeto "filtro" en python (5)
>>> n = [1,2,3,4]
>>> filter(lambda x:x>3,n)
<filter object at 0x0000000002FDBBA8>
>>> len(filter(lambda x:x>3,n))
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
len(filter(lambda x:x>3,n))
TypeError: object of type ''filter'' has no len()
No pude obtener la longitud de la lista que obtuve. Así que intenté guardarlo en una variable, como esta ...
>>> l = filter(lambda x:x>3,n)
>>> len(l)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
len(l)
TypeError: object of type ''filter'' has no len()
En lugar de usar un bucle, ¿hay alguna forma de obtener la longitud de esto?
Convertir un filtro en una lista requerirá más memoria, lo que puede no ser aceptable para grandes cantidades de datos. Puede encontrar la longitud del objeto de filtro sin convertirlo en una lista:
sum(1 for _ in filter(lambda x: x > 3, n))
Esta es una pregunta antigua, pero creo que esta pregunta necesita una respuesta utilizando la ideología de reducción de mapas . Así que aquí:
from functools import reduce
def ilen(iterable):
return reduce(lambda sum, element: sum + 1, iterable, 0)
ilen(filter(lambda x: x > 3, n))
Esto es especialmente bueno si n
no cabe en la memoria de la computadora.
Generalmente, los filter
y reductores no son pitónicos.
@arshajii mencionó esta solución:
len([x for x in n if x > 3])
Esto es bastante simple, pero no describe qué es exactamente lo que quiere hacer, y hace una lista que puede usar algo de memoria adicional. Una mejor solución es usar sum
con generador:
sum(1 for x in n if x > 3)
(Vea más sobre el generador aquí: https://www.python.org/dev/peps/pep-0289/#rationale )
Sin embargo, la sum
con el generador es en realidad más lenta en la mayoría de los casos debido a la implementación (probado en CPython 3.6.4):
In [1]: %timeit len([1 for x in range(10000000)])
356 ms ± 17.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [2]: %timeit sum(1 for x in range(10000000))
676 ms ± 7.05 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Tienes que recorrer el objeto filtro de alguna manera. Una forma es convertirlo en una lista:
l = list(filter(lambda x: x > 3, n))
len(l) # <--
Pero eso podría vencer el punto de usar filter()
en primer lugar, ya que podría hacerlo más fácilmente con una lista de comprensión:
l = [x for x in n if x > 3]
De nuevo, len(l)
devolverá la longitud.