簡體   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