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
。恕我直言,它只是另一个零参数函数。
我发现我写的一些代码有问题;当我从我的 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
。恕我直言,它只是另一个零参数函数。