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

#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