2017-07-14 12 views
1

ファイル内の各エンティティの親を解析した後に得られた親子関係を持つ実体の辞書があります。 次の構造を持つ辞書になります。各要素にはすべての親の完全なリストがあります。サンプル辞書:親を持つオブジェクトの辞書を子を持つ入れ子になった辞書に変換する

data_dict = { 
    '1388004': {'content': '13', 
       'parents': ['1280', '1279', '90964', '1385', '91061', '1239', '1783272', '2', '131567', '1'], 
       'name': 'foo'}, 
    '1895753': {'content': '11', 
       'parents': ['46913', '45401', '356', '28211', '1224', '2', '131567', '1'], 
       'name': 'bar'}, 
    '642227': {'content': '11', 
       'parents': ['82986', '1903409', '91347', '1236', '1224', '2', '131567', '1'], 
       'name': 'baz'}, 
    '89373': {'content': '27', 
       'parents': ['768507', '768503', '976', '68336', '1783270', '2', '131567', '1'], 
       'name': 'zab'}, 
    '81406': {'content': '21', 
       'parents': ['872', '194924', '213115', '28221', '68525', '1224', '2', '131567', '1'], 
       'name': 'oof'}, 
    '796027': {'content': '12', 
       'parents': ['410829', '410830', '4892', '4891', '147537', '716545', '4890', '451864', '4751', '33154', '2759', '131567', '1'], 
       'name': 'ofo'}, 
    '589342': {'content': '16', 
       'parents': ['3027', '2759', '131567', '1'], 
       'name': 'raz'} 
    } 

parentsリストは逆の順番に指定されたエンティティのすべての親を表します。それは589342の場合、階層は次のようになります。1(私のツリーのルート)は131567を含み、2759を含み、3027を含み、それ自体は589342です。

(の今のcontentnameフィールドを無視してみましょう)(私は現在持っているようではない両親)私が必要となる出力は、すべてのエンティティとその子供のリストや辞書である、と希望は、理想的のようなもののようになります。

{'id': '1', 'children':[{ 
    'id':'131567', 'children':[ 
      {'id':'2759', 'children':[...]}, 
      {'id':'2', 'children':[...]} 
     ] 
    }, 
    ... 
    ] 
} 

これを達成する方法についてのご意見は歓迎します。より多くの情報が必要な場合は、私に知らせてください。

+0

いいえ、「parents」リストはすべての親(オブジェクトの親とその親、腐敗に達するまで)のリストです。申し訳ありませんが私の説明が明らかでない場合。 – 2naab4u

+0

両親が*健全であることは保証されていますか?一方の親リストは '[a、b、c]'であり、他方は '[a、d、c]'である可能性はありますか? –

+0

はい、オブジェクトに到達する可能性のあるパスは常に1つだけです。 – 2naab4u

答えて

1

まず、あなたのdata_dictは「anchestors」のリストに変換します。

parents = [[k] + v["parents"] for k, v in data_dict.items()] 

その後、あなたは逆の順序でこれらのリストを反復処理することができますし、それに応じて辞書に新しいエントリを追加します。

root = {} 
for hierarchy in parents: 
    current = root 
    for node in reversed(hierarchy): 
     current = current.setdefault(node, {}) 

結果の形式は少し異なります...

{'1': {'131567': {'2': {'1224': {'1236': {'91347': {'1903409': {'82986': {'642227': {}}}}}, 
           '28211': {'356': {'45401': {'46913': {'1895753': {}}}}}, 
           '68525': {'28221': {'213115': {'194924': {'872': {'81406': {}}}}}}}, 
         '1783270': {'68336': {'976': {'768503': {'768507': {'89373': {}}}}}}, 
         '1783272': {'1239': {'91061': {'1385': {'90964': {'1279': {'1280': {'1388004': {}}}}}}}}}, 
        '2759': {'3027': {'589342': {}}, 
          '33154': {'4751': {'451864': {'4890': {'716545': {'147537': {'4891': {'4892': {'410830': {'410829': {'796027': {}}}}}}}}}}}}}}} 

...しかし、後で翻訳するにはyです。

def translate(d): 
    return [{"id": k, "children": translate(v)} for k, v in d.items()] 
+0

驚くばかり!私はウィレムのソリューションも好きだったが、彼はそれを削除したようだ...ありがとう! – 2naab4u

関連する問題