Подтвердить что ты не робот

Как найти длину объекта "filter" в python

>>> 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()

Я не мог получить длину списка, который у меня есть. Поэтому я попытался сохранить его в переменной, например...

>>> 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()

Вместо того, чтобы использовать цикл, есть ли способ получить длину этого?

4b9b3361

Ответ 1

Вы должны как-то перебирать объект фильтра. Один из способов - преобразовать его в список:

l = list(filter(lambda x: x > 3, n))

len(l)  # <--

Но это может привести к преждевременному использованию filter(), поскольку вы можете сделать это более легко с пониманием списка:

l = [x for x in n if x > 3]

Опять же, len(l) вернет длину.

Ответ 2

docs для python 3 говорит, что возвращает итератор

"Построить итератор из тех элементов, которые итерабельны, для которых функция возвращает true."

В python 2 он вернул список: см. здесь. Вам понадобится повторить объект фильтра, чтобы найти его длину.

Ответ 3

Это старый вопрос, но я думаю, что этот вопрос нуждается в ответе, используя идеологию map-reduce. Итак, здесь:

from functools import reduce

def ilen(iterable):
    return reduce(lambda sum, element: sum + 1, iterable, 0)

ilen(filter(lambda x: x > 3, n))

Это особенно хорошо, если n не помещается в память компьютера.