Как создать многоуровневое дерево решений из структуры JSON с помощью Python?

Я просто работаю над этим проектом, в котором хочу динамически генерировать многомерное дерево решений из JSON. JSON имеет вложенные правила принятия решений, и каждое правило как узел должно быть преобразовано. Дочерние узлы представляют собой точки принятия решений. Я приведу пример ниже:

{
  "rule": "A > 5",
  "true": {
   "rule": "B < 3",
  "true": {"rule": "C==1", "true": "Leaf 1", "false": "Leaf 2"},
    "false": {"rule": "D!= 4", "true": "Leaf 3", "false": "Leaf 4"}
  },
  "false": {
    "rule": "E>= 2",
    "true": {"rule": "F <6", "true": "Leaf 5", "false": "Leaf 6"},
    "false": {"rule": "G==0", "true": "Leaf 7", "false": "Leaf 8"}
  }
}

Цель — создать дерево решений с помощью Python. Каждый узел как экземпляр класса TreeNode. Я хочу, чтобы конкретные условия решили эту проблему.

class TreeNode:
    def __init__(self, rule, truebranch, falsebranch):
        self.rule = rule
        self.truebranch= truebranch
        self.falsebranch =falsebranch
    def evaluate(self, conditions):
        pass

Я ожидаю, что функция build_tree_from_json выполнит эту функцию. Я попробовал немного разобрать строки правил и управлять различными типами данных для конечных узлов дерева.

Мне нужно руководство по:

Правильный анализ операторов и значений.

Метод Evaluate должен справиться со всем этим правильно.

Обрабатывайте крайние случаи точно и без ошибок.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пока у вас есть «фактическое» условие (или любой другой код) в вашей строке, вам не нужно использовать какое-либо форматирование. функция eval(expression, globals, locals) может взять любую строку, представляющую код Python, и выполнить ее. например:

eval("print(3)") # output: 3
print(eval("5 >= 12")) # output: False
print(eval("A > 5", {"A": 6})) # output: True

единственное, на что вам нужно обратить внимание, это точку остановки листьев. Есть несколько способов сделать это, но я предпочитаю этот:

class TreeNode: 
    rule: str
    truebranch: 'TreeNode'
    falsebranch: 'TreeNode' 
    def __init__(self, data_json): 
        self.rule = data_json['rule']
        self.truebranch = None
        self.falsebranch = None
        if type(data_json["true"]) is dict:
            self.truebranch = TreeNode(data_json["true"])
        if type(data_json["false"]) is dict:
            self.falsebranch = TreeNode(data_json["false"])
    
    def evaluate(self, conditions):
        cond_result = eval(self.rule, conditions)
        if cond_result:
            if self.truebranch is not None:
                return self.truebranch.evaluate(conditions)
        else:
            if self.falsebranch is not None:
                return self.falsebranch.evaluate(conditions)
        return cond_result

это решение предполагает, что dict имеет правильный формат и что «Leaf x» не имеет особого значения.

Другие вопросы по теме