2016-11-23 23 views
0
def getCategoriesAsList(element): 
    try: 
     print "I am {0}".format(element.getNodeID()) 
     if element.hasChilds(): 
      for value in element.getChildren().values(): 
       print "{0} added to list".format(value.getNodeID()) 
       return [value]+getCategoriesAsList(value) 
     else: 
      print "{0} added to list".format(element.getNodeID()) 
      return [element] 
    except Exception as err: 
     print err 

おはようございます! 私はPythonで私のツリーを反復しようとしています。私はツリーをいくつかの変換を伴う要素のリストに変換したいと思っています。 問題は、要素が子でない場合に関数が再帰呼び出しを実行しないことです。私はいくつかのデバッグ情報を作成しますが、私はこの動作を理解できません!再帰呼び出しがブロックされました

+1

if if要素.hasChilds(): '条件は' else'にジャンプし、子がない場合に要素を返します。そうじゃない? –

+0

入力と現在および予想される出力の例を挙げてください。 –

+0

My Treeには7つのレベルがあり、各レベルの1つの要素だけがリストに追加され、他のノードは実行されません。 「要素」ノードに子要素がある場合は、その要素を反復処理し、子要素をリストに追加して、次のレベルに下がり、子要素が子要素になるまで子要素をチェックします。それがリストに追加され、ループの次の子アイテムをチェックするために上位レベルに達した場合 –

答えて

0

は、関数表記を保存し、更新されたバージョンです:

def getCategoriesAsList(element): 
    try: 
     print "I am {0}".format(element.getNodeID()) 
     result = [] 
     if element.hasChilds(): 
      for value in element.getChildren().values(): 
       print "{0} added to list".format(value.getNodeID()) 
       result.append(value) 
       result.extend(getCategoriesAsList(value)) 
     else: 
      print "{0} added to list".format(element.getNodeID()) 
      result.append(element) 
     return result 
    except Exception as err: 
     print err 

別のオプションはyieldを使用することです。それはあなたの次のソリューションを提供します:

def getCategoriesAsList(element): 
    try: 
     print "I am {0}".format(element.getNodeID()) 
     if element.hasChilds(): 
      for value in element.getChildren().values(): 
       print "{0} added to list".format(value.getNodeID()) 
       yield value 
       for v in getCategoriesAsList(value): 
        yield v 
     else: 
      print "{0} added to list".format(element.getNodeID()) 
      yield element 
    except Exception as err: 
     print err 

だけで次のように関数を呼び出したより:

print list(getCategoriesAsList(root)) 
+0

ありがとう、私はこのソリューションを作ったが、関数にパラメータを渡さずに再帰呼び出しを使用したい そして頭がリストに含まれていない –

0

forループに戻ってもループは継続しません。 returnの代わりにyieldキーワードを使用することを検討してください。

for value in element.getChildren().values(): 
    print "{0} added to list".format(value.getNodeID 
    yield [value]+getCategoriesAsList(value) 

説明:それはforループから戻るとき

、それはvalueが何であれ、可変機能とリターンにそのコールを停止します。

yieldキーワードはまったく同じですが、現在の関数呼び出しで実行を継続するので、すべてのforループを通過します。ここで

+0

yieldは反復の問題を解決しますが、別のものを作成します。コードを実行するとこのエラーが表示されます。リストにリストを作成するだけでリストを作成できます。 関数を呼び出すとキーワードリストが追加されますが、リストのリストが作成され、リスト内のすべてのアイテムが必要になります。 DEF getCategoriesAsList(エレメント): element.hasChilds IF():element.getChildrenにおける値の ()値(): プリント.format(value.getNodeIDを()) "{0}はリストに追加" yield [value] + list(getCategoriesAsList(value)) else: yield [element] –

+0

もし 'yield'が元の疑問符を解決すれば解決します。新しい問題については、 'yield'ではなく' else'文で 'return'を使います。それが役立つかどうかを見てください。 –

+0

私はpython 2.7を使用していて、ジェネレータに戻り値を追加できません。 –

0

を使用すると、すべてのXML Elementオブジェクトとの最終的なリストをしたいと仮定すると、あなたは別のアプローチを使用することができます。

def getCategoriesAsList(element): 
    i = element.iter() 
    return [next(i) for _ in i] 
関連する問題