#python #python-3.x
#python #python-3.x
Вопрос:
Как я могу найти длину объекта фильтра в python 3?
def is_valid_file(filename):
return True
full_path_fnames = filter(is_valid_file, full_path_fnames)
print(len(full_path_fnames))
Ответ №1:
Вы можете сказать, сколько элементов в нем было, только после того, как закончите итерацию по нему. Встроенная len
функция вызывает __len__
метод объекта, и, как вы можете видеть, filter
объекты не имеют этого метода
>>> '__len__' in dir(filter(bool, [0, 1, 2]))
False
потому что они в основном являются итераторами.
Один из возможных способов найти длину
>>> sum(1 for _ in filter(bool, [0, 1, 2]))
2
Другой способ — преобразовать его в list
type, который, конечно, имеет длину:
>>> len(list(filter(bool, [0, 1, 2])))
2
Обратите внимание, что все решения исчерпывают итератор, поэтому вы не сможете его повторно использовать:
>>> f = filter(bool, [0, 1, 2])
>>> list(f)
[1, 2]
>>> list(f)
[]
Комментарии:
1.
sum(1 for _ in filter(func, iterable))
это предпочтительный способ, если вы не можете поместить всю итерацию в память.
Ответ №2:
В Python2.x filter
возвращает a list
, но в Python3 он предоставляет вам итератор, который вы можете преобразовать в a list
, а затем проверить длину:
len(list(filter(foo, bar)))
ДЕМОНСТРАЦИЯ:
>>> filter(lambda x: x < 3, [1,2,3])
<filter object at 0x7fdf9ea1af90>
>>> list(filter(lambda x: x < 3, [1,2,3]))
[1, 2]
>>> len(list(filter(lambda x: x < 3, [1,2,3])))
2