繁体   English   中英

解析python中的数学表达式

[英]Parsing mathematical expressions in python

所以我目前正在开发一个 python 程序来解析数学表达式字符串并评估它们。 我目前有以下代码:

def evaluate(string):
    expr = [a for a in string if a!=" "]    
    for i,char in enumerate(expr):
        if char=="/":
            tmp = int(expr[i-1])/int(expr[i+1])
            expr[i+1] = tmp
            expr.pop(i)
            expr.pop(i-1)
        elif char=="*":
            tmp = int(expr[i-1])*int(expr[i+1])
            expr[i+1] = tmp
            expr.pop(i)
            expr.pop(i-1)
    for i,char in enumerate(expr):
        if char=="-":
            tmp = int(expr[i-1])-int(expr[i+1])
            expr[i+1] = tmp
            expr.pop(i)
            expr.pop(i-1)
        elif char=="+":
            tmp = int(expr[i-1])+int(expr[i+1])
            expr[i+1] = tmp
            expr.pop(i)
            expr.pop(i-1)
    return expr

我给了它输入2 / 2 + 3 * 4 - 6 * 2它返回["13", "-", "12"] 我用来诊断问题的一些步骤是:
1. 我将返回表达式移动到两个 for 循环之间。 然后程序返回["1.0", "+", "12", "-", "12"] ,所以我知道第二个循环只评估+
2.我认为可能是-代码块的问题,但是当我将输入更改为2 / 2 + 3 * 4 + 6 * 2它输出["13", "+", "12"]
3. 我让它在第二个循环中打印出 i ,它打印出0,1,2 所以问题来了,它只遍历列表的前 3 个元素。
我觉得问题与修改列表有关,并且以某种方式搞砸了枚举。 但是问题是什么使得第一个 for 循环工作正常而它打破了第二个? 任何帮助将不胜感激,因为我很困惑

使用这个改进的代码:

def evaluate(string):
    expr = [a for a in string if a!=" "]
    while( ('*' in expr) or ('/' in expr) or ('+' in expr) or ('-' in expr) ):
        for i,char in enumerate(expr):
            if char=="/":
                expr[i+1] = int(expr[i-1])/int(expr[i+1])
                del expr[i]
                del expr[i-1]
            elif char=="*":
                expr[i+1] = int(expr[i-1])*int(expr[i+1])
                del expr[i]
                del expr[i-1]
        for i,char in enumerate(expr):
            if char=="-":
                expr[i+1] = int(expr[i-1])-int(expr[i+1])
                del expr[i]
                del expr[i-1]
            elif char=="+":
                expr[i+1] = int(expr[i-1])+int(expr[i+1])
                del expr[i]
                del expr[i-1]
    return expr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM