我发现本教程在python中使用lambda.在尝试执行第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)
Run Code Online (Sandbox Code Playgroud)
结果是:
<filter object at 0x004F39F0>
要记住的事情:
[9, 15, 21, 30, 33, 45]据我所知,它在Python 3.4+中不起作用; 我更好奇为什么它不起作用,并且寻找一种平等的方式来做这个,有或没有lambda.
输出的差异是由在Python 3.x 中filter返回迭代器的事实引起的.因此,您需要手动调用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]
>>>
Run Code Online (Sandbox Code Playgroud)
同样适用map,在Python 3.x中也改变了返回迭代器.您可以在此处阅读有关这些更改的信息:https://docs.python.org/3/whatsnew/3.0.html#views-and-iterators-instead-of-lists
这就是说,filter与map一般由Python程序员不喜欢.特别是如果你需要使用lambda它们.在这种情况下(以及几乎所有其他方法)更好的方法是使用列表理解:
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)
Run Code Online (Sandbox Code Playgroud)