Python中的简单决策树(嵌套if语句)?
Posted
技术标签:
【中文标题】Python中的简单决策树(嵌套if语句)?【英文标题】:Simple decision tree (nested if-statement) in Python? 【发布时间】:2020-04-08 08:10:14 【问题描述】:我想在 JSON 中定义一个嵌套的 if
-statement 并使用 Python 对其进行测试。我正在考虑一个带有嵌套分支的简单决策树,并进行递归测试。
伪代码:
# is_valid = (a == b OR a == a) AND c == c # True
tree =
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
return
is_valid = is_tree_valid(tree)
当我在 Google 上搜索决策树时,我发现了很多与 AI 相关的内容,但往往过于深入。我正在寻找一些简单的东西,并猜测这是一个常见的话题,并且经常被重新发明。
我会感谢代码 sn-ps、模块或任何其他建议来完成 is_tree_valid()
。
提前致谢!
【问题讨论】:
is_tree_valid()
内部的逻辑难道不取决于您对“有效”的定义吗?我不完全清楚您要完成的工作,但请查看内置的ast
module。您可能正在重新发明***。
在制作原型时,我会创建key_name: validation_func
的映射并使用它。它有点笨重,但适用于较小的问题。但是您的 dict 看起来像是在重新发明 LR 解析器。看看PLY 包。您必须学习一些 lex 和 yacc,但是如果您正在创建某种语句语言/语法,那么从一开始就以正确的方式进行操作将对您以后大有裨益。 ast
是一个选项,但 IIRC 它仅适用于 Python 语法。
@BłażejMichalik 非常感谢您提供的链接和关键字。树会更复杂,这只是一个非常简化的示例。
a
/b
/c
代表什么?这些只是文字(这将是微不足道的),还是您的(Python)评估者知道的某种值?
@Mr.B.:当然,但代码中最复杂的部分是调用这些函数(或识别已经获得的结果)。
【参考方案1】:
这与算法一样重要,但将它们设计在一起只是合理的。要评估的表达式的最简单编码是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)
【讨论】:
非常感谢您提供这个sn-p。我没有看到任何括号,这意味着层次结构将保持平坦,对吗?它如何处理,例如(a == b OR a == a) AND c == c
?
@Mr.B.:JSON 的嵌套深度与表达式一样;括号(它们不会被优先级暗示)由对象层次结构暗示。在这种情况下,or 是 and 的左操作数。
啊,当然是嵌套的。 :-) 我期待明天用一个新鲜的大脑来测试它。再次非常感谢您。以上是关于Python中的简单决策树(嵌套if语句)?的主要内容,如果未能解决你的问题,请参考以下文章