首页 > 解决方案 > 解构 if/else Python

问题描述

我有一个程序可以输出这样的一些条件(这是实际输出,它是伪代码):

if ( first occurance of 'AB' <= -0.5 ) {
    return [ 0.]
} else {
    if ( number of products viewed <= 1.5 ) {
        if ( similarity to 'AB' <= 0.899999976158 ) {
            return [ 1.]
        } else {
            return [ 0.]
        }
    } else {
        if ( average time between actions <= 57.2111129761 ) {
            return [ 0.39145907]
        } else {
            return [ 0.10410805]
        }
    }
}

我怎样才能获得更易读(?)/解构的解决方案?IE:

( first occurance of 'AB' > -0.5 ) * (( number of products viewed <= 1.5 ) * ( similarity to 'AB' <= 0.899999976158 ))+((( number of products viewed > 1.5 ) * ( average time between actions <= 57.2111129761 ))

(我已经有可以将“<=”更改为“>”的代码,但除此之外,我似乎无法以正确的顺序隔离每个 if 条件。

编辑:用于获取当前输出的代码(恐怕不是最小的例子)

def get_code(tree, feature_names, tabdepth=0):
    left      = tree.tree_.children_left
    right     = tree.tree_.children_right
    threshold = tree.tree_.threshold
    features  = [feature_names[i] for i in tree.tree_.feature]
    value = tree.tree_.value
    f=[]

    def recurse(left, right, threshold, features, node, f, tabdepth=0):
            if (threshold[node] != -2):
                    print('\t' * tabdepth + 'if ( ' + features[node] + ' <= ' + str(threshold[node]) + ' ) {')
                    f.append('%' * tabdepth+'if ( ' + features[node] + ' <= ' + str(threshold[node]) + ' ) {')
                    if left[node] != -1:
                            recurse (left, right, threshold, features,left[node], f, tabdepth+1)
                    print('\t' * tabdepth+'} else {')
                    f.append('%' * tabdepth+'} else {')
                    if right[node] != -1:
                            recurse (left, right, threshold, features,right[node], f, tabdepth+1)
                    print('\t' * tabdepth + '}')
            else:
                    print('\t' * tabdepth + 'return ' + str(value[node][0]))
                    f.append('%' * tabdepth + 'return ' + str(value[node][0]))

    recurse(left, right, threshold, features, 0, f)

标签: pythonparsingsyntax

解决方案


听起来您需要编写代码:

  1. 解析 if/else 伪代码的任何实例,构建树结构;然后
  2. 递归遍历树结构,生成所需的布尔公式。

对于转换,主要思想是:

convert( if C then T else E )
==>
C * convert(T) + !C * convert(E)

如果您需要更具体的帮助,您可能应该问一个更具体的问题。


推荐阅读