首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过滤功能内的Lambda?

过滤功能内的Lambda?
EN

Stack Overflow用户
提问于 2014-12-26 16:34:23
回答 2查看 1.1K关注 0票数 2

我找到了关于在python中使用lambda的http://www.secnetix.de/olli/Python/lambda_functions.hawk教程。在尝试执行第三个示例时,我发现结果与本教程中的结果不一样。我99%肯定我的代码是正确的,但这里仍然是。

代码语言:javascript
复制
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
  • 使用Python2.7.2很好地工作并返回[9, 15, 21, 30, 33, 45]

我理解它在Python中根本不起作用;我更好奇为什么它不能工作,并且寻找一种与3.4+相同的方法,不管有没有lambda。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-26 16:35:52

输出的差异是由于filter在Python3.x中返回一个迭代器。因此,您需要手动调用它的list()以便获得一个列表:

代码语言:javascript
复制
>>> 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也是如此,它在Python3.x中也做了修改,以返回迭代器。您可以在这里了解这些更改:https://docs.python.org/3/whatsnew/3.0.html#views-and-iterators-instead-of-lists

也就是说,Python程序员通常不喜欢filtermap。特别是如果您需要对它们使用lambda,则尤其如此。在这种情况下,一种更好的方法(以及几乎所有其他方法)是使用列表理解

代码语言:javascript
复制
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)
票数 9
EN

Stack Overflow用户

发布于 2014-12-26 16:36:10

这是因为在Python 3中,过滤器函数返回一个迭代器。使用list(my_new_list)获得所有结果。显然,不是filter“不工作”,而是它在Python3.x中的行为与2.x不同。

有关前面的答案,请参见如何在Python 3中使用过滤器、映射和精简

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27659524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档