使用带有`map`的多个参数的函数

时间:2018-04-26 11:49:06

标签: python python-3.x lambda typeerror

我正在尝试将一个带有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映射到此输入的正确方法是什么?

3 个答案:

答案 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()。