在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))
2 个回答
3
在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
12
你只能在遍历完一个对象后,才能知道里面有多少个元素。Python内置的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)
[]