过滤函数中的Lambda?

时间:2014-12-26 16:34:24

标签: python python-3.x

我在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>

要记住的事情:

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

我知道它根本不适用于Python 3.4+;我更加好奇为什么它不起作用,也寻找一种平等的方式来做这件事,无论是否有lambda。

2 个答案:

答案 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


也就是说,filtermap通常不受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

这背后的原因是,如果你有一个大的列表,立即处理所有元素可能是不可取的。生成器将按需生成结果,在您最终只使用部分结果的情况下(例如,如果遍历已过滤的列表),可以节省内存。