决策树中的递归编程

时间:2016-11-05 02:14:00

标签: python recursion decision-tree

我在python中编写决策树。 tree是一个具有真分支tb和假分支fb的对象。只有根节点具有属性results

results是包含节点处每个目标变量(即因变量)的计数的字典。我正在研究二进制分类问题,因此一个例子就是字典{0: 25, 1: 9}

我想创建一个函数findrootnodes(tree),它遍历树,一直到根节点。它应该返回列表根节点。列表的每个元素都应包含一个字典。因此,具有四个根节点的决策树的示例将是[{0: 25, 1: 9}, {0: 2, 1: 65}, {0: 2, 1: 7}, {0: 52, 1: 4}]

我该怎么做?我目前的代码如下,但问题是它总是返回一个空列表。如果我将rootnodes从函数中删除,Python会抱怨在实例化之前引用了局部变量rootnodes。

def findrootnodes(tree):   
    rootnodes = []
    if tree.results != None:
        rootnodes += tree.results
    else: 
        findrootnodes(tree.tb)
        findrootnodes(tree.fb)
    return rootnodes

1 个答案:

答案 0 :(得分:2)

findrootnodes函数中,永远不会为非结果节点更改rootnodes的值。也就是说,当您致电findrootnodes时,您首先设置:

rootnodes = []

假设初始节点没有results,则运行:

    findrootnodes(tree.tb)
    findrootnodes(tree.fb)

......两者都没有改变rootnodes的值。然后你返回rootnodes,这仍然是一个空列表。

我认为你真正想要的是:

def findrootnodes(tree):   
    rootnodes = []
    if tree.results != None:
        rootnodes.append(tree.results)
    else: 
        rootnodes.extend(findrootnodes(tree.tb))
        rootnodes.extend(findrootnodes(tree.fb))
    return rootnodes

请注意,我已将+=此处更改为.append(...),因为:

>>> x = []
>>> x += {'key': 'value'}
>>> x
['key']

尝试通过+=将字典添加到列表中会将字典视为可迭代的,Python将迭代只是键