之前,我写过一篇如何在word中计算数学算式:
为了计算算式,就需要对算式进行格式化,把不规则的算式转换成规则的算式,这时就会涉及到一些字符的批量替换。如我们把算式:
1.3×14×2×[1+(76-50)/120]
转换成下面的规则算式,这样才能让Python中的eval()函数进行计算。
1.3*14*2*(1+(76-50)/120)
那么,如何把这里面的乘号替换成星号,把方括号替换中圆括号呢?这里我们采用下面的3种方法,通过python来实现。
利用replace函数,对于字符串中的三个字符进行多次替换,不需要导入其它的包,可以一次替换完成,并通过eval和round打印出保留2位小数后的结果,代码如下:
#replace法
s = "1.3×14×2×[1+(76-50)/120]"
if "×" or "[" in s:
s = s.replace("×","*").replace("[","(").replace("]",")")
print(round(eval(s),2))
我们可以制作一个替换用的字典,通过Python循环字典,对于符合要求的字符进行检测,如果在字典里可以查询到,就进行替换。
# 字典法
dic = {"x":"*","[":"(","]":")"}
for k,v in dic.items():
s.replace(k,v)
print(round(eval(s),2))
以上是遍历的字典,只需要循环3次即可,下面我还可以通过利用字典+列表推导式的形式实现。这里主要采用了字典的get()方法,替换转换为列表后的字符,然后再用join()函数合成。
s = "1.3×14×2×[1+(76-50)/120]"
dic = {"x":"*","[":"(","]":")"}
s = [dic.get(i,i) for i in s] #也可以使用这个列表推导式实现。
s = "".join(s)
print(round(eval(s),2))
用maketrans生成映射表,然后用translate进行批量替换,代码如下:
#maketrans映射法
s = "1.3×14×2×[1+(76-50)/120]"
intab = "×[]"
outtab = "*()"
transtab = str.maketrans(intab,outtab)
s = s.translate(transtab)
print(round(eval(s),2))
以下是在thonny中运行的效果展示: