2016-07-13 352 views
2

我有一個嵌套的dict它看起來像這樣:遞歸在字典

enter image description here

有關鍵children內的多個嵌套。無論何時出現密鑰children,我都希望捕獲密鑰branch。因爲有多個children,我想爲每個孩子做這個。當然,每個孩子也可以有更多的children。這個嵌套可以達到7層。

爲了達到這個目的,我可以寫一個骨頭的7-for循環方法或使用遞歸。所以我給了遞歸了一槍,用下面的代碼上來:

def GatherConcepts(header): 
    if 'children' in header.keys(): 
     if len(header['children']) > 0: 
      if 'branch' in header.keys(): 
       concepts.append(header['handle']) 
       if 'children' in header.keys(): 
        for j in range(0, len(header['children'])): 
         GatherConcepts(header['children'][j]) 
      else: 
       for i in range(0,len(header['children'])): 
        GatherConcepts(header['children'][i]) 

這段代碼的問題是,它給我的只有2級(因爲我調用該函數本身的2倍,因此不使用遞歸正確),而不是7.

我該如何改進以獲得所有級別?

任何指針將不勝感激。

+0

你能展示一個輸入的例子(提供的例子)和你期望的輸出嗎? –

+0

它看起來像頂級詞典有'孩子',但沒有'分支'(除非我正在讀取輸出不正確)...... – mgilson

+0

另外,FWIW,'some_dict.keys()'中的鍵將效率較低(顯着在python2.x上)比some_dict中的key更重要。 – mgilson

回答

1

你有一些不必要的冗餘。如果我理解正確,則需要將遞歸與遞歸分開添加到列表中,因爲您想在父項中測試branch

def GatherConcepts(header): 
    if 'children' in header and 'branch' in header: 
     for child in header['children']: 
      concepts.append(child['handle']) 
      GatherConcepts(child) 

你並不需要測試的header['children']長度 - 如果它是零,那麼循環將只是沒有做任何事情。

+0

我不想要分支的手柄,我想要孩子的手柄。我同意第二條陳述是不必要的。我只是爲了嘗試更多的東西而已。 – Patthebug

+0

這段代碼大部分工作正常,但是它給了我'branch's'handle',而我想'child's'' handle'。 – Patthebug

+0

20分鐘前我拿出了它,現在它給了孩子的手柄。 – Barmar

0

爲了正確地得到遞歸,你可以使用這個簡單的模板吧:

def recursive(variable): 
    if something: 
     # base step 
     return somethingelse 
    else: 
     # recursive step 
     return recursive(somethingelse) 

在你的情況,你可以嘗試這樣的事:

def gather_concepts(header): 
    # recursive step 
    if 'branch' in header and 'handle' in header: 
     concepts.append(header['handle']) 
    if 'children' in header: 
     for child in header['children']: 
      return gather_concepts(child) 
    # base step 
    else: 
     return 

你應該調整這個代碼儘管如此,因爲我沒有自己測試過。

+0

現在仔細看看這個詞典,我認爲'branch's'句柄可能也是不必要的。我只是在每個「孩子」的「處理」字段之後。我只想要在'children'裏面存在的所有'handle'的最終列表。 – Patthebug