Python 决策树中的递归规划
我正在用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}
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}]]有没有办法避免嵌套列表?是的,用扩展替换其他
中的追加
(请参阅我的更新以获得答案)