use*_*882 106 python list filter python-3.x
我正在学习Python中的过滤器概念.我正在运行这样一个简单的代码.
>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
Run Code Online (Sandbox Code Playgroud)
但是我没有得到一个列表,而是得到了这样的消息.
<filter object at 0x00FDC550>
Run Code Online (Sandbox Code Playgroud)
这是什么意思?这是否意味着我的过滤对象即出来的列表存储在该内存位置?我如何获得我需要的清单?
mgi*_*son 174
看起来你正在使用python 3.x. 在python3, ,filter,map,zip等返回一个对象,它是可迭代的,但不是列表.换一种说法,
filter(func,data) #python 2.x
Run Code Online (Sandbox Code Playgroud)
相当于:
list(filter(func,data)) #python 3.x
Run Code Online (Sandbox Code Playgroud)
我认为它已被更改,因为您(通常)想要在惰性意义上进行过滤 - 您不需要消耗所有内存来预先创建列表,只要迭代器返回相同的列表即可会在迭代期间.
如果您熟悉列表推导和生成器表达式,则上面的过滤器现在(几乎)等效于python3.x中的以下过滤器:
( x for x in data if func(x) )
Run Code Online (Sandbox Code Playgroud)
相反:
[ x for x in data if func(x) ]
Run Code Online (Sandbox Code Playgroud)
在python 2.x中
slo*_*oth 21
如果你想要一个清单,就行了
list(filter(f, range(2, 25)))
Run Code Online (Sandbox Code Playgroud)
尽管如此,您可以使用循环遍历此对象for.
for e in filter(f, range(2, 25)):
do_stuff(e)
Run Code Online (Sandbox Code Playgroud)