计算 python 中字符串中的数学表达式
Evaluating math expressions in a string in python
我有一堆从 JSON file 加载的方程式,我想计算这些表达式。这些表达式有一些常量,常量的值(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.
我将简单地用 dict
更新 globals()
,然后使用 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
。这更像是一种黑客攻击,但我不知道更优雅的方式。还要记住 eval
是一个不太安全的函数。
我有一堆从 JSON file 加载的方程式,我想计算这些表达式。这些表达式有一些常量,常量的值(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.
我将简单地用 dict
更新 globals()
,然后使用 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
。这更像是一种黑客攻击,但我不知道更优雅的方式。还要记住 eval
是一个不太安全的函数。