2017-04-23 83 views
1

我想在此數組中找到父級兄弟。例如,如果我將「item_b」放入方法中,它必須返回「item_1」(忽略「children」作爲父項)。類似的東西:在混合字典/列表中查找父級兄弟

>>> parent = get_parent(arr, 'item_i', ['children']) 
>>> parent['id'] 
item_c 
>>> parent = get_parent(arr, 'item_1', ['children']) 
>>> parent['id'] 
None 

我的身份證是獨一無二的,所以我知道只會有一位家長。

我看過mgilsonClaudiu的例子,但我無法弄清楚如何將這些改爲我所追求的。 Claudius解決方案看起來像是正確的方向,但對於我的陣列,它只返回[]


編輯: ewcz解決方案的偉大工程。我修改了一點,讓越來越標題,以及:

def get_parent(arr, item_id): 
    L = [(None, arr)] 
    while L: 
     parent_item, item = L.pop() 
     curr_id = item.get('id', None) 
     if curr_id == item_id: 
      return parent_item 

     children = item.get('children', []) 
     for child in children: 
      L.append((item, child)) 

parent = get_parent(arr, 'item_i') 
print(parent.get('id')) 
print(parent.get('title')) 
+0

你確定標題中的「兄弟」字嗎?從描述中看,您只需要父項。同胞項目將是那些共享父項目的項目,例如您的示例中的「item_i」和「item_ii」。 – gereleth

+0

@gereleth你可能是對的,但我認爲'id'和'title'是'children'的兄弟姐妹。 – NinjaFart

+0

我最近了解了a *算法,現在我發現@ewcz代碼與算法非常相似。只是認爲這可能有助於任何谷歌:) – NinjaFart

回答

1

一個辦法是遍歷你的陣列,並儘快返回父ID爲遍歷點擊感興趣的項目:

def get_parent(arr, item_id): 
    L = [(None, arr)] 
    while L: 
     parent_id, item = L.pop() 

     curr_id = item.get('id', None) 
     if curr_id == item_id: 
      return parent_id 

     children = item.get('children', []) 
     for child in children: 
      L.append((curr_id, child)) 

parent = get_parent(arr, 'item_i') 
+0

謝謝!在我的文章中看到修改的解決方 – NinjaFart

+0

@NinjaFart我的榮幸,雖然我認爲修改會直接給你帶有指定ID的元素,而不是它的父母... – ewcz

+0

Ups,你是對的。我更新了我的帖子 - 現在應該開始工作。 – NinjaFart

相關問題