Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 决策树中的递归规划_Python_Recursion_Decision Tree - Fatal编程技术网

Python 决策树中的递归规划

Python 决策树中的递归规划,python,recursion,decision-tree,Python,Recursion,Decision Tree,我正在用python编写一个决策树树是一个对象,它有一个真分支tb和一个假分支fb。只有根节点具有属性results results是一个字典,其中包含节点处每个目标变量(即因变量)的计数。我正在研究一个二进制分类问题,所以一个例子是字典{0:25,1:9} 我想创建一个函数findrootnodes(tree),它在树中迭代,直到根节点。它应该返回根节点列表。列表中的每个元素都应该包含一个字典。因此,具有四个根节点的决策树的示例是[{0:25,1:9},{0:2,1:65},{0:2,1:7}

我正在用python编写一个决策树<代码>树是一个对象,它有一个真分支
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

findrootnodes
函数中,对于非结果节点,永远不会更改
rootnodes
的值。也就是说,当调用
findrootnodes
时,首先设置:

rootnodes = []
假设初始节点没有
结果
,则运行:

    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']

试图通过
+=
将字典添加到列表中时,会将字典视为一个iterable,Python将只对键进行迭代。

谢谢,特别是关于通过
+=
将字典添加到列表中的部分,结果如下所示:[[[{0.0:10,1.0:11}],[0.0:157,1.0:23}],[[[{0.0:7,1.0:177}][{0.0:77,1.0:44}]]有没有办法避免嵌套列表?是的,用
扩展
替换
其他
中的
追加
(请参阅我的更新以获得答案)