我正在尝试将一个需要 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 映射到此输入的正确方法是什么?
>map
会将每个值从enumerate
作为单个参数传递给回调,即lambda
将使用元组作为参数进行调用。如果map
解开看起来无法打包的参数,那将是相当令人惊讶的行为,因为那样它的行为将取决于它迭代的值。
要扩展可迭代参数,请改用starmap
,它在传递参数时"应用*
(星号)":
from itertools import starmap
n = starmap(lambda index, value: ..., enumerate(alphabet))
Python 无法自动解压缩 lambda 参数。enumerate
返回一个tuple
,所以lambda
必须把这个元组作为唯一的参数
你需要:
n = map(lambda t: t[1].upper() if t[0] % 2 else t[1], enumerate(alphabet))
现在考虑到map
+lambda
+ 手动开箱的丑陋,我建议替代生成器理解:
n = (value.upper() if index % 2 else value for index,value in enumerate(alphabet))
(我删除了lower()
调用,因为您的输入已经是小写的)
Python 无法自动解压缩lambda
参数。
但是您可以通过向map
传递额外的range
参数来解决此问题:
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)
根据文档:
map(函数,可迭代,...)
返回应用函数的迭代器 到可迭代的每个项目,产生结果。如果附加 传递可迭代参数,函数必须接受那么多参数 并并行应用于所有可迭代对象中的项。跟 多个可迭代对象,当最短的可迭代对象为 用尽。对于功能输入已安排的情况 进入参数元组,请参阅 itertools.starmap()。