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