微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将字符串传递给 lambda 函数

如何解决将字符串传递给 lambda 函数

我试图在给定字符串列表的情况下自动生成 lambda 函数,以生成 scipy.optimize.minimize() 例程的约束。我有一个 list 的字符串对,我需要将其传递给每个 lambda 函数约束,如下所示:

list = [
["parameter1","parameter2"],["parameter3","parameter4"]
]

constraints = []
for pair in list:
    constraints.append( {"type":"ineq","fun": lambda p: p[param_names.index(pair[0])]-p[param_names.index(pair[1])]} )

但是,当将此约束列表传递给 scipy.optimize.minimize() 时,这些约束将被忽略。或者,当我像这样明确定义字符串时

cons = [
{'type':'ineq','fun': lambda p: p[param_names.index("parameter1")]-p[param_names.index("parameter2")] },{'type':'ineq','fun': lambda p: p[param_names.index("parameter3")]-p[param_names.index("parameter4")] }
]

scipy.optimize.minimize() 遵守约束。我相信这是我如何定义 lambda 函数的问题,即将变量(字符串)传递给 lambda 函数,而不是 scipy.optimize.minimize() 的问题。我需要我的代码能够解析上述字符串对列表,以自动定义这些 lambda 函数和约束,因为列表可能因情况而异。

有没有办法将 lambda 函数外部的变量传递到 lambda 函数中?或者我应该这样做的另一种方式?

解决方法

有关类似问题,请参阅 this answer。在您的情况下,问题是在 lambda 表达式中使用了名称 pair。由于 Python 的 late-binding closurespair 将引用它在评估 lambda 时的值,而不是它在定义 lambda 时的值。在您的代码中,这可能意味着 pair 将始终引用 list 中的 last 元素。

一个可能的fix

constraints = []
for pair in list:
    constraints.append({"type": "ineq","fun": lambda p,pair=pair: p[param_names.index(pair[0])]-p[param_names.index(pair[1])]})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。