Znajdź długość obiektu filtru w Pythonie 3


Jak mogę znaleźć długość obiektu filtru w Pythonie 3?
def is_valid_file(filename):
return Truefull_path_fnames = filter(is_valid_file, full_path_fnames)print(len(full_path_fnames))

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dopiero po zakończeniu iteracji możesz stwierdzić, ile było elementów. Wywołuje wbudowaną funkcję
len
metoda
https://docs.python.org/3.4/re ... len__
__len__
i jak widać, obiekty
filter
nie mają tej metody
>>> '__len__' in dir(filter(bool, [0, 1, 2]))
False

ponieważ są w zasadzie iteratorami.
Jeden możliwy sposób na określenie długości
>>> sum(1 for _ in filter(bool, [0, 1, 2]))
2

Innym sposobem jest przekonwertowanie go na typ
list
, który oczywiście ma długość:
>>> len(list(filter(bool, [0, 1, 2])))
2

Pamiętaj, że wszystkie rozwiązania wyczerpią iterator, więc nie będziesz mógł go ponownie użyć:
>>> f = filter(bool, [0, 1, 2])
>>> list(f)
[1, 2]
>>> list(f)
[]
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W Python2.x
filter
zwraca
list
, ale w Python3 daje ci iterator, który możesz przekonwertować na
list
, a następnie sprawdzić długość:
len(list(filter(foo, bar)))

Demonstracja:
>>> 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

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się