在Python 3中查找过滤对象的长度

4 投票
2 回答
7787 浏览
提问于 2025-04-18 10:15

我怎么能在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) 
[]

撰写回答