2017-12-15 13 views
0

問題におけるアイテムのレベルを取得:ネストされたリスト

は、私はいくつかのリンクされたデータを持っていると私はこの絵にこのような構造を構築したい:

をしてもらいます将来的には私の木構造の最下位レベルを凝視することによっていくつかの計算を行いますので、各項目のレベル。

期待される結果:

  • レベル0:
  • レベル1:A = B、C、D
  • 私は私のレベルごとにアイテムを与える構造を取得する必要があります

  • レベル2:D = E、F、G
  • レベル3:E = H、I、J、K

私がこれまで試してみました何:

を私は動作をシミュレートするために、この再帰的なコードを試してみたが、私は項目に項目のレベルを取得できませんよ。

dict_item = {"A": ["B","C","D"], "D": ["E","F","G"], "E":["H","I","J"]} 
def build_bom(product): 
    if not dict_item.get(product): 
     return product 
    else : 
     return [build_bom(x) for x in dict_item.get(product)] 
print(build_bom("A")) 

私の出力は、このようなネストされたリストです:

['B', 'C', [['H', 'I', 'J'], 'F', 'G']] 

私の質問:

私は、これは私の問題を処理するための最良の方法であるかはわかりません。 希望の出力を得るには?ここ が所望の出力である:

[ {"parent_E":["H", "I", "J"]}, 
{"parent_D": ["E", "F", "G"]}, 
{"parent_A"} :["D","C","B"]}, 
] 

辞書のリスト(キーが親で、値が子供である場合)、リストの最初の要素は、私の構造の最下位レベルで、最後は最高の要素です。

PS:これはシミュレーションですが、将来はこのコードで大規模なデータセットを処理する必要があります。 助けていただければ幸いです。

+2

「そして、どのように取得します所望の出力?あなたは私たちにあなたの出力を見せましたが、あなたは "望ましい出力"が何であるかを決して言及しませんでした出力が希望の出力であれば、あなたの質問は明確ではありません。現在のアプローチで何が問題になっていますか? – alfasin

+0

私は「期待される結果」のセクションを見ていますが、期待される結果の実際の*出力*は表示されません。 – alfasin

+1

を試してみてください: '[{{" parent_ "+ k:v} k、dict_item.items()で' – alfasin

答えて

1

これは私がこの問題に近づく方法です。まず、dict_itemオブジェクトからツリーを生成します。

dict_item = {"A": ["B","C","D"], "D": ["E","F","G"], "E":["H","I","J"]} 

def build_tree(x): 
    if x in dict_item: 
     return {x: [build_tree(v) for v in dict_item[x]]} 
    else: 
     return x 

tree = build_tree("A") 
print(tree) 
>>> {'A': ['B', 'C', {'D': [{'E': ['H', 'I', 'J']}, 'F', 'G']}]} 

次に、ツリーで幅優先検索を実行します。我々はリストに追加し、子を持つ要素を打つたび:

results = [] 
queue = [tree] 

while queue: 
    x = queue.pop(0) 
    if isinstance(x, dict): 
     parent, children = list(x.items())[0] 
     results.append({'parent_' + parent: dict_item[parent]}) 
     for child in children: 
      queue.append(child) 

print(results) 
>>> [{'parent_A': ['B', 'C', 'D']}, {'parent_D': ['E', 'F', 'G']}, {'parent_E': ['H', 'I', 'J']}] 

はその後、我々が今行う必要があるのは、リストを逆にすることです:

print list(reversed(results)) 
>>> [{'parent_E': ['H', 'I', 'J']}, {'parent_D': ['E', 'F', 'G']}, {'parent_A': ['B', 'C', 'D']}] 
+0

大丈夫、私はそれを試してみましょう!今興味深いです –

+0

BFSのalgoの仕組みを理解していなくても、期待通りに動作してくれてありがとう –

+0

python3のサポートの編集を追加しました –

関連する問題