首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中找到"filter“对象的长度

如何在python中找到"filter“对象的长度
EN

Stack Overflow用户
提问于 2013-10-04 21:15:54
回答 3查看 75.5K关注 0票数 76
代码语言:javascript
复制
>>> 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()

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

代码语言:javascript
复制
>>> 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()

除了使用循环之外,有没有什么方法可以得到它的长度?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-04 21:18:34

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

代码语言:javascript
复制
l = list(filter(lambda x: x > 3, n))

len(l)  # <--

但这可能会在一开始就失去使用filter()的意义,因为使用列表理解可以更容易地做到这一点:

代码语言:javascript
复制
l = [x for x in n if x > 3]

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

票数 104
EN

Stack Overflow用户

发布于 2018-07-14 14:41:08

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

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

票数 16
EN

Stack Overflow用户

发布于 2018-06-14 16:16:07

通常,filterreduce不是pythonic式的。

@arshajii提到了这个解决方案:

代码语言:javascript
复制
len([x for x in n if x > 3])

这很简单,但并不能准确地描述您想要做什么,并且它会生成一个可能会使用一些额外内存的列表。更好的解决方案是在生成器中使用sum

代码语言:javascript
复制
sum(1 for x in n if x > 3)

(请在此处查看有关生成器的更多信息:https://www.python.org/dev/peps/pep-0289/#rationale)

然而,由于实现(在CPython 3.6.4中测试),带生成器的sum实际上在大多数情况下都比较慢:

代码语言:javascript
复制
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)
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19182188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档