我想在JSON中定义一个嵌套的if
语句,并用Python来测试它。我在考虑一个简单的决策树,带有嵌套的分支,并递归地进行测试。
伪代码:
# is_valid = (a == b OR a == a) AND c == c # Truetree = { branches: [ { value1: 'a', operator: '==', value2: 'b', child_connector: 'or' children: [ { value1: 'a', operator: '==', value2: 'a' } ] }, { connector: 'and', value1: 'c', operator: '==', value2: 'c' } ]}def is_tree_valid(tree): # TODO returnis_valid = is_tree_valid(tree)
当我在谷歌上搜索决策树时,我发现了很多与AI相关的资料,但通常过于深入。我在寻找一些简单的东西,并且猜测这是一个常见的话题,并且经常被重新发明。
我很感激能得到代码片段、模块或任何其他建议来完成is_tree_valid()
。
提前感谢!
回答:
这既关乎输入也关乎算法,但将它们一起设计是合理的。最简单的表达式编码是直接翻译抽象语法树(AST):
{ "operator": "and", "left": { "operator": "or", "left": { "operator": "==", "left": "a", "right": "b" }, "right": { "operator": "==", "left": "a", "right": "a" } }, "right": { "operator": "==", "left": "c", "right": "c" }}
然后(在解析成明显的Python结构后),评估看起来像这样
def evaluate(node): try: op=node['operator'] except TypeError: return node # leaf l=evaluate(node['left']) r=node['right'] # not evaluated yet if op=='==': return l==evaluate(r) elif op=='and': return l and evaluate(r) elif op=='or': return l or evaluate(r) else: raise ValueError("unknown operator: %r"%op)