Как найти длину объекта "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()
Вместо того, чтобы использовать цикл, есть ли способ получить длину этого?
Ответы
Ответ 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
не помещается в память компьютера.