过滤函数中的Lambda?

A M*_*oon 2 python python-3.x

我发现教程在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>

要记住的事情:

  • 我正在使用Python 3.4.2
  • 使用Python 2.7.2正常工作并返回 [9, 15, 21, 30, 33, 45]

据我所知,它在Python 3.4+中不起作用; 我更好奇为什么它不起作用,并且寻找一种平等的方式来做这个,有或没有lambda.

iCo*_*dez 8

输出的差异是由在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


这就是说,filtermap一般由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)