2016-11-05 21 views
1

私はPythonで意思決定ツリーをプログラミングしています。 treeは真の枝tbと偽の枝fbを持つオブジェクトです。ルートノードのみが属性resultsを持っています。意思決定ツリーの再帰的プログラミング

resultsは、ノードにおける各目標変数(すなわち従属変数)のカウントを含む辞書である。私はバイナリの分類問題に取り組んでいるので、例は辞書{0: 25, 1: 9}です。

ツリー内をルートノードまで繰り返し処理する関数findrootnodes(tree)を作成します。それはリストのルートノードを返すべきです。リストの各要素には辞書が含まれている必要があります。したがって、4つのルートノードを持つ決定木の例は[{0: 25, 1: 9}, {0: 2, 1: 65}, {0: 2, 1: 7}, {0: 52, 1: 4}]です。

どうすればいいですか?私の現在のコードは以下ですが、問題は常に空のリストを返すことです。関数からルートノードを取り除くと、Pythonはインスタンス化される前にローカル変数のルートノードが参照されていると不満を持ちます。あなたのfindrootnodes機能で

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

答えて

2

、あなたは非結果ノードのためのrootnodesの値を変更することはありません。それはあなたがfindrootnodesを呼び出すときに、あなたが最初に設定し、次のとおりです。

rootnodes = [] 

初期ノードがresultsを持っていないと仮定すると、あなたがして実行します。rootnodesの値を変更どちらも

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

を... 。そして、あなたはまだrootnodesを返します。これはまだ空リストです。

私はあなたが実際にしたいことはあると思う:私はこのために、.append(...)にここにあなたの+=を変更した

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 

注:

に辞書を追加しようと
>>> x = [] 
>>> x += {'key': 'value'} 
>>> x 
['key'] 

リストは+=で辞書を反復可能文字として扱います。これはPythonがのキーだけを反復します。です。

+0

ありがとうございます。特に、辞書をリストに追加する方法については、 '+ =' – wwl

+0

です。結果は次のようになります:[[{{0.0:10、1.0:11}]、[{0.0:157,1.0: 23}]、[[{0.0:7、1.0:177}]、[{0.0:77、1.0:44}]]] – wwl

+0

入れ子リストを避ける方法はありますか? – wwl

関連する問題