我找到了关于在python中使用lambda的http://www.secnetix.de/olli/Python/lambda_functions.hawk教程。在尝试执行第三个示例时,我发现结果与本教程中的结果不一样。我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。
发布于 2014-12-26 16:35:52
输出的差异是由于filter在Python3.x中返回一个迭代器。因此,您需要手动调用它的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也是如此,它在Python3.x中也做了修改,以返回迭代器。您可以在这里了解这些更改:https://docs.python.org/3/whatsnew/3.0.html#views-and-iterators-instead-of-lists
也就是说,Python程序员通常不喜欢filter和map。特别是如果您需要对它们使用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)发布于 2014-12-26 16:36:10
这是因为在Python 3中,过滤器函数返回一个迭代器。使用list(my_new_list)获得所有结果。显然,不是filter“不工作”,而是它在Python3.x中的行为与2.x不同。
有关前面的答案,请参见如何在Python 3中使用过滤器、映射和精简。
这背后的原因是,如果您有一个大的列表,立即处理所有的元素可能是不可取的。生成器将根据需要生成结果,在只使用部分结果的情况下,可以节省内存(例如,迭代过滤后的列表)。
https://stackoverflow.com/questions/27659524
复制相似问题