我正在尝试将一个带有2个参数的函数映射到列表:
my_func = lambda index, value: value.upper() if index % 2 else value.lower()
import string
alphabet = string.ascii_lowercase
n = map(my_func, enumerate(alphabet))
for element in n:
print(element)
这给了我一个TypeError: <lambda>() missing 1 required positional argument: 'value'
。
将lambda映射到此输入的正确方法是什么?
答案 0 :(得分:4)
map
会将enumerate
中的每个值作为单个参数传递给回调,即lambda
将以元组作为参数调用。如果map
解包看起来无法解压缩的参数,那将是非常令人惊讶的行为,因为它的行为将取决于它迭代的值。
要扩展可迭代参数,请改用starmap
,在传递参数时“应用*
(星号)”:
from itertools import starmap
n = starmap(lambda index, value: ..., enumerate(alphabet))
答案 1 :(得分:2)
Python无法自动解包lambda参数。 RTMP URL
返回webRTC
,因此enumerate
必须将该元组作为唯一参数
你需要:
tuple
现在考虑lambda
+ n = map(lambda t: t[1].upper() if t[0] % 2 else t[1], enumerate(alphabet))
+手动拆包的丑陋,我会建议替代生成器理解:
map
(我已删除lambda
来电,因为您的输入已经小写
答案 2 :(得分:2)
Python无法自动解包lambda
个参数。
但你可以通过向range
传递额外的map
参数来解决这个问题:
import string
alphabet = string.ascii_lowercase
n = map(lambda i, v: v.upper() if i % 2 else v.lower(),
range(len(alphabet)),
alphabet)
for element in n:
print(element)
根据docs:
地图(功能,可迭代,...)
返回应用函数的迭代器 到每个可迭代的项目,产生结果。 如果有的话 传递可迭代的参数,函数必须采用那么多参数 并且可以并行地应用于所有迭代的项目。 With 多个迭代,迭代器在最短迭代时停止 累。对于已经安排了功能输入的情况 参数元组,参见itertools.starmap()。