2015-01-09 2 views
0

Я нашел проблему с кодом, который я пишу; когда я извлекаю данные из своего 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 представление математической задачи Я считаю, что это весь код, требуется чтобы воспроизвести проблему. В настоящее время он не хранит функции (мощность, ЕСЛИ, НЕ) в порядке, отличном от постфикса, однако он сохраняет значения в правильном порядке.

+1

Это не постфиксная нотация. Это просто дерево с каждой операцией в правильном порядке оценки. – poke

+0

Я действительно не понимаю, какой результат вы хотите получить. Вы говорите, что ваша функция превращает эти объекты JSON в строку, но фактически хранит их в списке. Итак, это нормальное выражение (например, 'sum (3 + 4 * 3 * 2 + 2,1,2,3)'), что вы хотите, или постфиксное обозначение (например, '[3, 4, 3, '*', 2, '*', '+', 2, '+', 1, 2, 3, 'sum'] ')? Кроме того, postfix не работает с функциями, которые принимают любое количество параметров. – poke

ответ

0

Если вы хотите сделать постфикс, вы должны поместить имя функции после аргументов. Это все.

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 отдельно. ИМХО это просто еще одна функция с нулевыми параметрами.