You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用列表推导式将函数列表逐元素应用于参数列表?

如何用列表推导式实现函数与对应参数的映射

先悄悄提一句,你说第一个函数可正常运行,但其实它并没有实现你真正想要的功能——它只会返回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

火山引擎 最新活动