使用 Python 时,我发现很难让 filter() 与 lambda 一起工作,以应对需要传递超过 1 个参数的情况,如下面的代码片段所示:
max_validation = lambda x,y,z: x < y < z
sequence1 = [1,4,8]
filter(max_validation, sequence1)
它引发了以下错误:
TypeError: <lambda>() takes exactly 3 arguments (1 given)
请指出这里做错了什么。
最佳答案
确切地弄清楚您要做什么有点困难。我将解释您的问题,然后提供答案。如果这不正确,请修改您的问题或对此答案发表评论。
问题
我有正好三个元素长的序列。这是一个:
sequence1 = [1, 4, 8]
我想确保第一个元素小于第二个元素,而第二个元素又应该小于第三个元素。为此,我编写了以下函数:
max_validation = lambda x, y, z: x < y < z
如何使用 filter
应用它?使用 filter(max_validation, sequence1)
不起作用。
回答
Filter 将您的函数应用于提供的可迭代对象的每个元素,如果函数返回 True
则选取它,如果函数返回 False
则丢弃它。
在您的例子中,filter
首先查看值 1
。它试图将其传递到您的函数中。您的函数需要三个参数,但只提供了一个,因此失败。
您需要进行两项更改。首先,将您的三元素序列放入列表或其他序列中。
sequences = [[1, 4, 8], [2, 3, 9], [3, 2, 3]]
max_validation = lambda x: x[0] < x[1] < x[2] and len(x) == 3
我添加了另外两个序列进行测试。因为 sequences
是列表的列表,所以每个列表都会传递给您的测试函数。即使您只测试一个序列,您也应该使用 [[1, 4, 8]]
以便将要测试的整个序列传递到您的函数中。
我还修改了 max_validation
以便它只接受一个参数:要测试的列表。我还添加了 和 len(x) == 3
以确保序列的长度只有 3 个元素
关于python - 如何让过滤器与带多个参数的 lambda 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4391043/