>>> n = [1,2,3,4]
>>> filter(lambda x:x>3,n)
<filter object at 0x0000000002FDBBA8>
>>> len(filter(lambda x:x>3,n))
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
len(filter(lambda x:x>3,n))
TypeError: object of type 'filter' has no len()我无法得到我得到的列表的长度。所以我试着把它保存到一个变量中,就像这样...
>>> l = filter(lambda x:x>3,n)
>>> len(l)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
len(l)
TypeError: object of type 'filter' has no len()除了使用循环之外,有没有什么方法可以得到它的长度?
发布于 2013-10-04 21:18:34
您必须以某种方式遍历filter对象。一种方法是将其转换为列表:
l = list(filter(lambda x: x > 3, n))
len(l) # <--但这可能会在一开始就失去使用filter()的意义,因为使用列表理解可以更容易地做到这一点:
l = [x for x in n if x > 3]同样,len(l)将返回长度。
发布于 2018-07-14 14:41:08
将筛选器转换为列表将占用额外的内存,这对于大量数据可能是不可接受的。您可以查找filter对象的长度,而无需将其转换为列表:
sum(1 for _ in filter(lambda x: x > 3, n))
发布于 2018-06-14 16:16:07
通常,filter和reduce不是pythonic式的。
@arshajii提到了这个解决方案:
len([x for x in n if x > 3])这很简单,但并不能准确地描述您想要做什么,并且它会生成一个可能会使用一些额外内存的列表。更好的解决方案是在生成器中使用sum:
sum(1 for x in n if x > 3)(请在此处查看有关生成器的更多信息:https://www.python.org/dev/peps/pep-0289/#rationale)
然而,由于实现(在CPython 3.6.4中测试),带生成器的sum实际上在大多数情况下都比较慢:
In [1]: %timeit len([1 for x in range(10000000)])
356 ms ± 17.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [2]: %timeit sum(1 for x in range(10000000))
676 ms ± 7.05 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)https://stackoverflow.com/questions/19182188
复制相似问题