如何用列表推导式将函数列表逐元素应用于参数列表?
如何用列表推导式实现函数与对应参数的映射
先悄悄提一句,你说第一个函数可正常运行,但其实它并没有实现你真正想要的功能——它只会返回lstInterFuncs里第一个函数处理所有参数的结果,根本没用到后面的函数。比如当你传入x=[1,2,3]和[f1,f2,f3]时,它返回的是[f1(1),f1(2),f1(3)],而不是你期望的[f1(1),f2(2),f3(3)]。你的第二个函数也因为逻辑不对,最后只返回了最后一个函数处理所有参数的结果,自然不符合需求。
要实现你要的「对应位置函数处理对应位置参数」,关键是把函数列表和参数列表按位置配对,这里可以用zip()函数来把两个列表的元素一一对应起来,然后用列表推导式遍历每一对元素。
正确的实现方式
用列表推导式的话,一行就能搞定:
def makeNewYaxisLstofArrays(newXaxisListofArray, lstInterFuncs): return [f(x) for f, x in zip(lstInterFuncs, newXaxisListofArray)]
为什么这样可行?
zip(lstInterFuncs, newXaxisListofArray)会把两个列表中同索引位置的元素打包成元组,比如当lstInterFuncs是[f1,f2,f3],newXaxisListofArray是[1,2,3]时,zip会生成(f1,1), (f2,2), (f3,3)这样的迭代器。- 列表推导式遍历每一个元组,把元组里的函数
f作用在参数x上,最终生成你想要的目标数组。
实际测试验证
举个简单的例子测试这个函数:
# 定义几个测试函数 def f1(x): return x + 1 def f2(x): return x * 2 def f3(x): return x ** 2 x_list = [1,2,3] func_list = [f1,f2,f3] # 调用函数 print(makeNewYaxisLstofArrays(x_list, func_list)) # 输出 [2,4,9],完全符合预期
另外要注意:如果两个列表的长度不一样,zip会以较短的那个列表为准,多余的元素会被忽略。如果需要处理这种长度不匹配的情况,可以根据你的实际需求调整(比如补一个默认函数,或者抛出异常提示)。
内容的提问来源于stack exchange,提问作者Angel Lira




