2016-11-23 102 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

'如果element.hasChilds():'條件將跳轉到'else'並在沒有子節點的情況下返回元素。是不是? –

+0

請給出一個輸入和當前和預期輸出的例子。 –

+0

我的樹有7個級別,每個級別只有一個元素添加到列表中,並且不執行其他節點。 我的期待是一旦「元素」節點有孩子,遍歷它們並將孩子添加到列表中,並下到下一級檢查這個孩子的孩子,直到他是一片葉子。如果是將他添加到列表中,並且到達上一級以檢查循環中的下一個子項目 –

回答

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循環中返回時,它將不會繼續。考慮使用yield關鍵字而不是return

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(): 用於element.getChildren()值的值(): 打印 「{0}添加到列表」 .format(value.getNodeID()) yield [value] + list(getCategoriesAsList(value)) else: yield [element] –

+0

如果'yield'解決了原來的問號,它就解決了。對於新問題,在'else'語句中使用'return',而不是'yield'。看看是否有幫助。 –

+0

我使用python 2.7,不能將返回值添加到生成器中 –

0

假設你想與所有XML Element對象最終名單,你可以使用不同的方法:

def getCategoriesAsList(element): 
    i = element.iter() 
    return [next(i) for _ in i]