python-3.x - 在python中评估字符串中的数学表达式
问题描述
我有一堆从JSON 文件加载的方程,我想评估这些表达式。这些表达式有一些常量,常量的值 ( K1
, K2
, ...) 也保存在 json 文件中。var1
与表达式中存在的变量 ( , ...)对应的值var2
在字典中定义vars
。我想在表达式中插入常量和变量的值并计算数值。
import json
vars = {"var1": 1, "var2": 2, "var3": 3, "var4": 4, "var5": 5, "var6": 5}
with open("tst.json", 'r') as f:
r = json.load(f)
print(r)
json内容:
{
"EQ1": {
"parameters": {
"EQ1_coeff1": {
"value": 1.0e-06
},
"P2": {
"value": 3.0
},
"P3": {
"value": 3.0
}
},
"expression": "(EQ1_coeff1 * ((1 dimensionless)/(1 dimensionless)) / (1 dimensionless))*(var1^P3/(var1^P3 + P2^P3) )"
},
"EQ2": {
"parameters": {
"EQ2_coeff2": {
"value": 5253
},
"K2": {
"value": 3
},
"K5": {
"value": 1
},
"K3": {
"value": 525
},
"K4": {
"value": 3
},
"K6": {
"value": 2
},
"K7": {
"value": 0.01
}
},
"expression": "(EQ2_coeff2 *((var2*var3)/(K1*K2))* ((1 dimensionless - ((var3*var4)/(var2))/K6) / ((1 dimensionless + var1/K1)*(1 dimensionless + var2)+ 1 dimensionless)))*(1 dimensionless/(1 dimensionless + var5/K7))"
}
}
我想就如何expression
计算这些表达式(存储在 中)征求意见。
边注:
1 dimensionless
只不过是1。
解决方案
我将简单地使用 更新globals()
然后dict
使用eval
,如下所示:
import json
vars = {"var1": 1, "var2": 2, "var3": 3, "var4": 4, "var5": 5, "var6": 5}
r = {
"EQ1": {
"parameters": {
"EQ1_coeff1": {
"value": 1.0e-06
},
"P2": {
"value": 3.0
},
"P3": {
"value": 3.0
}
},
"expression": "(EQ1_coeff1 * ((1 dimensionless)/(1 dimensionless)) / (1 dimensionless))*(var1^P3/(var1^P3 + P2^P3) )"
},
"EQ2": {
"parameters": {
"EQ2_coeff2": {
"value": 5253
},
"K2": {
"value": 3
},
"K5": {
"value": 1
},
"K3": {
"value": 525
},
"K4": {
"value": 3
},
"K6": {
"value": 2
},
"K7": {
"value": 0.01
}
},
"expression": "(EQ2_coeff2 *((var2*var3)/(K1*K2))* ((1 dimensionless - ((var3*var4)/(var2))/K6) / ((1 dimensionless + var1/K1)*(1 dimensionless + var2)+ 1 dimensionless)))*(1 dimensionless/(1 dimensionless + var5/K7))"
}
}
globals().update( **{k:v['value'] for k,v in r["EQ1"]["parameters"].items()})
globals().update( **{k:v['value'] for k,v in r["EQ2"]["parameters"].items()})
globals().update(**vars)
eval(r['EQ1']['expression'].replace("dimensionless", "").replace("^", "**"))
这给出了:3.571428571428571e-08
因为EQ2
您没有K1
定义变量。这更像是一种 hack,不过我不知道有一种更优雅的方式。还要记住eval
一个不是很安全的功能。
推荐阅读
- html - 调整浏览器大小时,我的 div 容器溢出
- java - java.sql.SQLSyntaxErrorException: ORA-01797: 此运算符后面必须跟 ANY 或 ALL
- flutter - Flutter,Bloc,为什么MapEventToState中只使用Stream
- react-native - 没有幻灯片动画的介绍滑块
- excel - 将参数作为 VBA 中的数组传递给工作表函数
- html - 在反应链接中使用 noreferrer 可以避免哪些风险?
- twilio - Twilio - 快速问题(无法更新记录)
- firebase - 如何管理firebase中的权限以允许不同的用户读取/更新/写入?
- python - 驱动程序关闭后杀死python脚本?(硒,蟒蛇)
- scala - Scala中的延迟分页(迭代器的流/迭代器?)