这是我的代码:
filter(lambda n,r: not n%r,range(10,20))
我收到错误:
TypeError: <lambda>() takes exactly 2 arguments (1 given)
然后我尝试了:
foo=lambda n,r:not n%r
哪个工作正常。所以我认为这会奏效:
bar=filter(foo,range(10,20))
但又一次:
TypeError: <lambda>() takes exactly 2 arguments (1 given)
地图也会发生类似情况。但减少工作正常。我究竟做错了什么?我是否遗漏了使用过滤器或地图所需的重要内容?
答案 0 :(得分:6)
为什么使用2个参数? filter()
和map()
只需要一个带有单个参数的函数,例如:
filter(lambda x: x >= 2, [1, 2, 3])
>>> [2, 3]
要查找数字的因子(您也可以用lambda替换它):
def factors(x):
return [n for n in range(1, x + 1) if x % n == 0]
factors(20)
>>> [1, 2, 4, 5, 10, 20]
答案 1 :(得分:5)
If you run map or filter on a key-value set, then add parentheses around (k,v), like:
.filter(lambda (k,v): k*2 + v)
答案 2 :(得分:4)
因为python中的filter
只接受一个参数。因此,如果要在过滤器中使用它,则需要定义一个只接受一个参数的lambda /函数。
答案 3 :(得分:0)
您的lambda函数有两个参数n
和r
。必须使用带有一个参数的函数调用filter
,并在保留项目时返回True
。也许你打算在lambda函数之外定义r
或n
,然后在闭包中捕获它。
答案 4 :(得分:0)
这是由于map函数实现的性质所致,map,reduce和filter的第二个参数是list,但它读取和传递值到这些方法的第一个参数的方式不同,如果您在下面看到reduce函数的默认选择2从list传递到lambda的元素,但是filter和map只需要一个元素。
>>>reduce(lambda x,y: x+ y,range(10))
45
>>>filter(lambda x,y: x+ y,range(10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes exactly 2 arguments (1 given)
>>>filter(lambda x: x+ 1,range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
>>>map(lambda x,y: x+ y,range(10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes exactly 2 arguments (1 given)
>>>
>>>map(lambda x: x+1, range(10))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>