Найти длину объекта фильтра в python 3

Как найти длину объекта фильтра в python 3?

def is_valid_file(filename): return True full_path_fnames = filter(is_valid_file, full_path_fnames) print(len(full_path_fnames)) 

Вы можете сказать, сколько элементов у него было, только после того, как вы закончили его повторять. Встроенная функция len вызывает метод __len__ объекта и, как видите, объекты filter не имеют этого метода

 >>> '__len__' in dir(filter(bool, [0, 1, 2])) False 

потому что они в основном итераторы.

Одним из возможных способов нахождения длины является

 >>> sum(1 for _ in filter(bool, [0, 1, 2])) 2 

Другой – преобразовать его в тип list , который, конечно, имеет длину:

 >>> len(list(filter(bool, [0, 1, 2]))) 2 

Обратите внимание, что все решения будут исчерпывать итератор, поэтому вы не сможете его повторно использовать:

 >>> f = filter(bool, [0, 1, 2]) >>> list(f) [1, 2] >>> list(f) [] 

В Python2.x filter возвращает list , но в Python3 он дает вам итератор, который вы можете преобразовать в 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