将具有多个参数的函数与"map"一起使用



我正在尝试将一个需要 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()。

最新更新