Sri*_*har 48 filter variable-length python-3.x
>>> 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()
Run Code Online (Sandbox Code Playgroud)
我无法得到我得到的清单的长度.所以我尝试将它保存到变量中,就像这样......
>>> 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()
Run Code Online (Sandbox Code Playgroud)
而不是使用循环,有没有办法得到这个的长度?
ars*_*jii 67
你必须以某种方式迭代过滤器对象.一种方法是将其转换为列表:
l = list(filter(lambda x: x > 3, n))
len(l) # <--
Run Code Online (Sandbox Code Playgroud)
但这可能会首先打败使用点filter(),因为你可以通过列表理解更容易地做到这一点:
l = [x for x in n if x > 3]
Run Code Online (Sandbox Code Playgroud)
再次,len(l)将返回长度.
小智 24
这是一个老问题,但我认为这个问题需要使用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))
Run Code Online (Sandbox Code Playgroud)
如果n不适合计算机内存,这尤其好.
Moh*_*eid 15
将过滤器转换为列表会占用额外的内存,这对于大量数据来说可能是不可接受的。您可以在不将其转换为列表的情况下找到过滤器对象的长度:
sum(1 for _ in filter(lambda x: x > 3, n))
Ian*_*Lin 10
通常,filter并且reduce不是pythonic。
@arshajii 提到了这个解决方案:
len([x for x in n if x > 3])
Run Code Online (Sandbox Code Playgroud)
这很简单,但并没有描述您究竟想要做什么,它生成了一个可能会使用一些额外内存的列表。更好的解决方案是sum与生成器一起使用:
sum(1 for x in n if x > 3)
Run Code Online (Sandbox Code Playgroud)
(在此处查看有关生成器的更多信息:https : //www.python.org/dev/peps/pep-0289/#rationale)
然而,sum在大多数情况下,由于实现(在 CPython 3.6.4 中测试),生成器实际上更慢:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
42302 次 |
| 最近记录: |