我正在尝试计算以下表达式(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/','/'))