Python 来自 JSON 文件的后缀顺序

Python Postfix order from JSON file

我发现我写的一些代码有问题;当我从我的 JSON 文件中提取数据并将其放入 POSTFIX 顺序时,当遇到诸如 Power、Sum、IF、NOT 等函数时,它不会将它们放入正确的后缀顺序。 多年来我一直试图解决这个问题,但我不明白如何解决。 以下是 JSON 文件的一些示例:

sum(3+4*3*2+2,1,2,3)

{
    "arguments": [{
            "rightArgument": {
                "value": "2",
                "type": "constant"
            },
            "leftArgument": {
                "rightArgument": {
                    "rightArgument": {
                        "value": "2",
                        "type": "constant"
                    },
                    "leftArgument": {
                        "rightArgument": {
                            "value": "3",
                            "type": "constant"
                        },
                        "leftArgument": {
                            "value": "4",
                            "type": "constant"
                        },
                        "type": "operation",
                        "operator": "*"
                    },
                    "type": "operation",
                    "operator": "*"
                },
                "leftArgument": {
                    "value": "3",
                    "type": "constant"
                },
                "type": "operation",
                "operator": "+"
            },
            "type": "operation",
            "operator": "+"
        }, {
            "value": "1",
            "type": "constant"
        }, {
            "value": "2",
            "type": "constant"
        }, {
            "value": "3",
            "type": "constant"
        }],
    "name": "sum",
    "type": "function"
}

另一个例子,power(2,3)+not(2=1):

    {
    "rightArgument": {
        "arguments": [{
                "rightArgument": {
                    "value": "1",
                    "type": "constant"
                },
                "leftArgument": {
                    "value": "2",
                    "type": "constant"
                },
                "type": "operation",
                "operator": "="
            }],
        "name": "not",
        "type": "function"
    },
    "leftArgument": {
        "arguments": [{
                "value": "2",
                "type": "constant"
            }, {
                "value": "3",
                "type": "constant"
            }],
        "name": "power",
        "type": "function"
    },
    "type": "operation",
    "operator": "+"
}   

最后:IF(1,IF(1,2,3),A1)

{
    "arguments": [{
            "value": "1",
            "type": "constant"
        }, {
            "arguments": [{
                    "value": "1",
                    "type": "constant"
                }, {
                    "value": "2",
                    "type": "constant"
                }, {
                    "value": "3",
                    "type": "constant"
                }],
            "name": "IF",
            "type": "function"
        }, {
            "cell": "A1",
            "value": "",
            "type": "cell"
        }],
    "name": "IF",
    "type": "function"
}

如您所见,我必须满足许多不同格式的公式

目前我将数学问题存储到字符串中的代码是这样的:

def _getCurrentOperator(data):
    if data["type"] == "operation":

        _getCurrentOperator(data["rightArgument"])        
        _getCurrentOperator(data["leftArgument"]) 
        valueList.append(data["operator"])
    elif data["type"] == "group":
        _getCurrentOperator(data["argument"]) 
    elif data["type"] == "function":
        if (data["name"] == "pi"):
            valueList.append(3.14159265359)   
        else:                     
            valueList.append(data["name"])

        for i in range(len(data["arguments"])):
            _getCurrentOperator(data["arguments"][i])
    else:
        if (data["value"]) == '':
            valueList.append(data["cell"])
        else:
            valueList.append(float(data["value"]))

输入数据是数学问题的 JSON 表示 我相信这是复制问题所需的所有代码。 目前它不以非后缀顺序存储函数(power、IF、NOT),但它确实以正确的顺序存储值。

如果你想让它成为后缀,你必须把函数名放在参数之后。就这些了。

def _getCurrentOperator(data):
    if data["type"] == "operation":
        _getCurrentOperator(data["rightArgument"])        
        _getCurrentOperator(data["leftArgument"]) 
        valueList.append(data["operator"])  # here you do it right
    ...
    elif data["type"] == "function":
        if (data["name"] == "pi"):
            valueList.append(3.14159265359)   
        else:                     
            for i in range(len(data["arguments"])): # first the arguments...
                _getCurrentOperator(data["arguments"][i])
            valueList.append(data["name"])          # then the operation
    else:
        ...

此外,您可能不应该单独处理 pi。恕我直言,它只是另一个零参数函数。