2017-04-23 27 views
1

この配列内の親の兄弟を探したいと思います。混在のdict /リストで親の兄弟を見つける

arr = { 
    'children': [ 
     { 
      'id':'item_1', 
      'title':'Item 1', 
      'children': [ 
       { 
        'id':'item_a', 
        'title':'Item A' 
       }, 
       { 
        'id':'item_b', 
        'title':'Item B' 
       }, 
       { 
        'id':'item_c', 
        'title':'Item C', 
        'children': [ 
         { 
          'id':'item_i', 
          'title':'Item I' 
         }, 
         { 
          'id':'item_ii', 
          'title':'Item II' 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

たとえば、「item_b」をメソッドに挿入すると、「item_1」(親として「子供」は無視されます)を返す必要があります。これと似たようなもの:

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

私のIDは一意であるため、親が1つしかないことはわかっています。

私は例を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コードがアルゴリズムと非常によく似ていることがわかりました。ちょうどこれがgooglersを助けるかもしれないと思った:) – 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

関連する問題