使用值评估表达式

  • 本文关键字:表达式 评估 python
  • 更新时间 :
  • 英文 :


我正在尝试计算以下表达式(exp(。我正在尝试用values[I]替换exp中的var[I],并评估表达式,非常感谢您的帮助。我尝试过re.subs和replace,但它不起作用。

exp='((2*3.14)/(550*12))*((R*F*L)/t)'
var=['R','F','L','t']
values=[1202,10.12,15.63,60]

它应该输出:((23.14(/(55012((((12021.12*15.63(/60(=3.016

您可以使用具有命名值的f-string,并使用dict 对其进行格式化

exp = "((2*3.14)/(550*12))*(({R}*{F}*{L})/{t})"
var = ["R", "F", "L", "t"]
values = [1202, 10.12, 15.63, 60]
valdict = dict(zip(var, values))
print(valdict)
filled = exp.format(**valdict)
print(filled)
print(eval(filled))

哪个产生

{'R': 1202, 'F': 10.12, 'L': 15.63, 't': 60}
((2*3.14)/(550*12))*((1202*10.12*15.63)/60)
3.0151464826666667

当然,如果你是构建var/values的人,你应该跳过这两个列表,直接构建valdict,这会使它更具可读性。

如果你只想打印三个十进制数字,请使用

print(f"{eval(filled):.3f}")

它根据您的要求打印3.015而不是3.016,但它应该是正确的值。

干杯!

我假设each var的值在values列表中的同一索引处您只需将values列表中具有相应值的变量替换为exp字符串

exp='((2*3.14)/(550*12))*((R*F*L)/t)'
var=['R','F','L','t']
values=[1202,10.12,15.63,60]
for i,j in zip(var, values):
exp = exp.replace(i, str(j))

输出

>>exp
'((2*3.14)/(550*12))*((1202*10.12*15.63)/60)'

您可以调用eval函数来计算该值。

>>eval(exp)
3.0151464826666667

如果只有这样简单的变量名(单个字母(,那么以下就足够了:

expr = '((2*3.14)/(550*12))*((R*F*L)/t)'
var = ['R','F','L','t']
values = [1202,10.12,15.63,60]
for n,v in zip(var, values):
expr = expr.replace(n,str(v))
print(f'{expr} = {eval(expr):.5f}')

将格式说明符设置为所需的格式说明符或将其删除。

如果您有更复杂的变量名称,请尝试使用sympy。示例:

import sympy
var = sympy.symbols('R F L t')
values = [1202,10.12,15.63,60]
expr = sympy.sympify('((2*3.14)/(550*12))*((R*F*L)/t)', evaluate=False)
with sympy.evaluate(False):
num_expr = expr.subs(zip(var, values))
print(f'{num_expr} = {num_expr.doit():.5f}')

无法清除打印的"*1/",但您可以手动移除:

...
print(f'{num_expr} = {num_expr.doit():.5f}'.replace('*1/','/'))

最新更新