python3 funcion comprehension array python-3.x filter variable-length

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)


Los docs para Python 3 dicen que devuelve un iterador.

"Construya un iterador a partir de los elementos de iterable para los cuales la función devuelve true".

En Python 2 devolvió una lista: ver here . Necesitará iterar el objeto del filtro para encontrar su longitud.


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.