Я нашел проблему с кодом, который я пишу; когда я извлекаю данные из своего JSON-файла и помещаю его в порядок POSTFIX, когда вы сталкиваетесь с такими функциями, как Power, Sum, IF, NOT, он не помещает их в правильный постфиксный порядок. Я пытался решить эту проблему на века, но я не могу понять, как ее решить. Вот некоторые примеры файла JSON:Python Postfix order from JSON file
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 представление математической задачи Я считаю, что это весь код, требуется чтобы воспроизвести проблему. В настоящее время он не хранит функции (мощность, ЕСЛИ, НЕ) в порядке, отличном от постфикса, однако он сохраняет значения в правильном порядке.
Это не постфиксная нотация. Это просто дерево с каждой операцией в правильном порядке оценки. – poke
Я действительно не понимаю, какой результат вы хотите получить. Вы говорите, что ваша функция превращает эти объекты JSON в строку, но фактически хранит их в списке. Итак, это нормальное выражение (например, 'sum (3 + 4 * 3 * 2 + 2,1,2,3)'), что вы хотите, или постфиксное обозначение (например, '[3, 4, 3, '*', 2, '*', '+', 2, '+', 1, 2, 3, 'sum'] ')? Кроме того, postfix не работает с функциями, которые принимают любое количество параметров. – poke