Python 3.x 如何找到“a”的长度;“过滤器”;python中的对象 >n=[1,2,3,4] >>>过滤器(λx:x>3,n) >>>透镜(滤波器(λx:x>3,n)) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 透镜(滤波器(λx:x>3,n)) TypeError:类型为“filter”的对象没有len()

Python 3.x 如何找到“a”的长度;“过滤器”;python中的对象 >n=[1,2,3,4] >>>过滤器(λx:x>3,n) >>>透镜(滤波器(λx:x>3,n)) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 透镜(滤波器(λx:x>3,n)) TypeError:类型为“filter”的对象没有len(),python-3.x,filter,variable-length,Python 3.x,Filter,Variable Length,我无法得到我得到的列表的长度。所以我试着把它保存到一个变量中,就像这样 >>> 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&g

我无法得到我得到的列表的长度。所以我试着把它保存到一个变量中,就像这样

>>> 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=过滤器(λx:x>3,n)
>>>莱恩(l)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
莱恩(l)
TypeError:类型为“filter”的对象没有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()
同样,
len(l)
将返回长度。

对于python 3,它将返回一个迭代器

“从iterable的元素构造一个迭代器 函数返回true。“

在Python2中,它返回了一个列表:参见。
您将需要迭代筛选对象以查找其长度。

这是一个老问题,但我认为这个问题需要使用map reduce来回答。 因此,这里:

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

如果
n
不适合计算机内存,这一点尤其好。

通常,
filter
reduce
不是pythonic

@arshajii采用了以下解决方案:

from functools import reduce

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

ilen(filter(lambda x: x > 3, n))
这很简单,但并没有描述您到底想做什么,它列出了一个可能需要额外内存的列表。 更好的解决方案是在生成器中使用
sum

len([x for x in n if x > 3])
(请参见此处有关生成器的详细信息:)

但是,在大多数情况下,使用生成器的
sum
速度实际上较慢,这是因为实现(在CPython 3.6.4中进行了测试):


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

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

sum(1表示过滤器中的uu(λx:x>3,n))

在生成对象之前,无法知道生成器将生成多少对象。如果您关心优化,您可以使用先验信息来加快速度-例如,如果您知道您的列表已排序,您可以丢弃
索引(3)
下面的项目。这是最简单的方法,但实际上不是正确的方法。我更喜欢阿尔胡和曹的答案。python内部不支持reduce方式,这是多么遗憾啊!如果
n
相当大,此解决方案会占用大量额外内存。这比使用列表迭代的len快吗?不是用python,但如果要优化需要过滤对象长度的算法,构建列表来计算长度不是最佳方法。
sum(1 for x in n if x > 3)
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)