【发布时间】:2014-06-18 17:23:41
【问题描述】:
如何在 python 3 中找到过滤器对象的长度?
def is_valid_file(filename):
return True
full_path_fnames = filter(is_valid_file, full_path_fnames)
print(len(full_path_fnames))
【问题讨论】:
标签: 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))
【问题讨论】:
标签: python python-3.x
只有在完成对它的迭代后,你才能说出它有多少元素。内置len 函数调用对象的__len__ method,如您所见,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)
[]
【讨论】:
sum(1 for _ in filter(func, iterable)) 是如果您无法将整个迭代放入内存中的首选方式。
在 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
【讨论】: