如何在python中找到“过滤器”对象的长度

>>> 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()

除了使用循环之外,还有什么方法可以获取此长度?

Srichakradhar asked 2020-06-30T04:46:20Z
5个解决方案
66 votes

您必须以某种方式遍历过滤器对象。 一种方法是将其转换为列表:

l = list(filter(lambda x: x > 3, n))

len(l)  # <--

但这可能会首先挫败使用len(l)的意义,因为您可以通过列表理解更轻松地做到这一点:

l = [x for x in n if x > 3]

同样,len(l)将返回长度。

arshajii answered 2020-06-30T04:47:05Z
23 votes

这是一个古老的问题,但是我认为这个问题需要使用map-reduce意识形态的答案。所以在这里:

from functools import reduce

def ilen(iterable):
    return reduce(lambda sum, element: sum + 1, iterable, 0)

ilen(filter(lambda x: x > 3, n))

如果n不适合计算机内存,则特别好。

Al Hoo answered 2020-06-30T04:47:30Z
10 votes

python 3的文档说它返回一个迭代器

“从那些可迭代的元素构造一个迭代器 函数返回true。”

在python 2中,它返回了一个列表:请参见此处。您将需要迭代过滤器对象以找到其长度。

doctorlove answered 2020-06-30T04:47:59Z
3 votes

通常,sumreduce不是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中测试),在大多数情况下,带有generator的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)
Ian Lin answered 2020-06-30T04:48:38Z
3 votes

将过滤器转换为列表将占用额外的内存,这对于大量数据可能是不可接受的。 您可以找到过滤器对象的长度,而无需将其转换为列表:

sum(1 for _ in filter(lambda x: x > 3, n))

Mohammad Banisaeid answered 2020-06-30T04:48:58Z
translate from https://stackoverflow.com:/questions/19182188/how-to-find-the-length-of-a-filter-object-in-python