Как проанализировать данные json с высокой степенью вложенности, которые представляют арифметическое выражение - PullRequest
0 голосов
/ 05 октября 2019

Я просто хочу написать программу на Python, которая может принимать арифметические выражения в формате JSON, анализировать и оценивать ответ.

Каждый оператор, такой как PLUS, принимает как минимум 2 аргумента, MINS и TIMES принимают ровно 2 аргумента,но проверки не имеют отношения

Я могу прочитать объект JSON, но сложность в том, что я не понимаю, как я могу использовать рекурсию для анализа вложенного объекта.

Любое руководство/ help / ideas было бы полезно

Я думал, что рекурсия была бы отличной вещью для использования здесь, но я не понимаю, какими должны быть базовые случаи и как обрабатывать различные типы операций (плюс, минус, раз)

{
    "root": { "description": "Result should be 8",      
        "plus": [{
            "times": [{
                "int": 2
            }, {
                "int": 3
            }]
        }, {
            "minus": [{
                "int": 4
            }, {
                "int": 2
            }]
        }]
    }

Объект два, который доставляет мне больше проблем

{
    "root": { "description":" it evaluates to 12.",     
        "plus": [{
                "plus": [{
                        "plus": [{
                                "plus": [{
                                        "plus": [{
                                                "int": 2
                                            },
                                            {
                                                "int": 2
                                            }
                                        ]
                                    },
                                    {
                                        "int": 2
                                    }
                                ]
                            },
                            {
                                "int": 2
                            }
                        ]
                    },
                    {
                        "int": 2
                    }
                ]
            },
            {
                "int": 2
            }
        ]
    }
}

Я пробовал использовать приведенный ниже код, но он не работает должным образом с вложенными выражениями:

def operation():    
   val = 0    
   with open("expression1.json") as complex_data:
       data = complex_data.read()
       z = json.loads(data)

       data = z['root']    
       for op in data:
           if op == 'description':
               pass
           elif op == 'plus':
               return sum(element[k] for element in data[op] for k in element)
           elif op == 'minus' or op == 'times':
               if len(data[op]) != 2:
                   raise ValueError('2 elements expected if operation is minus >or times')
               nums = [element[k] for element in data[op] for k in element]
               if op == 'minus':
                   return abs(nums[0] - nums[1])
               else:
                   return nums[0]*nums[1]
           else:
               raise ValueError('Invalid operation') 

Извините, я впервые использую переполнение стека, и я не понимаю, как форматировать код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...