我在python中找到了使用lambda的this教程。在尝试执行第3个示例时,我发现结果与教程中的结果不同。我99%肯定我的代码是正确的,但在这里它仍然是。
my_list = [2,9,10,15,21,30,33,45]
my_new_list = filter(lambda x: x % 3 == 0, my_list)
print(my_new_list)
结果是:
<filter object at 0x004F39F0>
要记住的事情:
[9, 15, 21, 30, 33, 45]
我知道它根本不适用于Python 3.4+;我更加好奇为什么它不起作用,也寻找一种平等的方式来做这件事,无论是否有lambda。
答案 0 :(得分:8)
输出的差异是由filter
在Python 3.x中返回iterator这一事实引起的。因此,您需要手动调用list()
以获取列表:
>>> my_list = [2,9,10,15,21,30,33,45]
>>> filter(lambda x: x % 3 == 0, my_list)
<filter object at 0x01ACAB50>
>>> list(filter(lambda x: x % 3 == 0, my_list))
[9, 15, 21, 30, 33, 45]
>>>
同样适用于map
,它在Python 3.x中也被更改为返回迭代器。您可以在此处了解这些更改:https://docs.python.org/3/whatsnew/3.0.html#views-and-iterators-instead-of-lists
也就是说,filter
和map
通常不受Python程序员的欢迎。特别是如果您需要使用lambda
。在这种情况下(以及几乎所有其他方法)更好的方法是使用list comprehension:
my_list = [2,9,10,15,21,30,33,45]
my_new_list = [x for x in my_list if x % 3 == 0]
print(my_new_list)
答案 1 :(得分:4)
这是因为在Python 3中,filter函数返回一个迭代器。使用list(my_new_list)
获取所有结果。要清楚,并不是filter
“不起作用”,而是Python 3.x中的行为与2.x相比有所不同。
有关上一个答案,请参阅How to use filter, map, and reduce in Python 3。
这背后的原因是,如果你有一个大的列表,立即处理所有元素可能是不可取的。生成器将按需生成结果,在您最终只使用部分结果的情况下(例如,如果遍历已过滤的列表),可以节省内存。