2017-03-03 18 views
1

Python 3でツリー階層を作成できません。クラスを使用せずにこれを行うことができます。私は、クラスを使用せず(木)辞書変数を作成し、何かで終わるしたいクラス/オブジェクトを使用せずにツリー階層を再帰的に作成する

data=[['E1', 'C1'],['C1', 'P1'],['P1', 'R1'],['E2', 'C2'],['C2', 'P2'],['P2', 'R1'],['C3', 'P2'],['E3', 'C4'],['C4', 'P3'], 
    ['P3', 'R2'],['C5', 'P3'],['E4', 'C6'],['C6', 'P4'], ['P4', 'R2'],['E5', 'C7'],['C7', 'P5'],['P5', 'R3'],['E6', 'C9'],['C9', 'P6'],['P6', 'R3'], 
    ['C8', 'P6'],['E7', 'C10'],['C10', 'P7'],['P7', 'R4'],['C11', 'P7'],['E8', 'C12'],['C12', 'P8'],['P8', 'R4']] 

私は起動する必要があり、データが順番にフォーマット['ID','Parent']ではありません以下のような:

Tree={'R1':{'P1':{},'P2':{}},'R2':{}} etc 

OR

Tree={'R1':[{'P1':[],'P2':[]}],'R2':[]} etc 

明らかに、R1とR2にはそれよりも多くの子がありますが、おそらくそれはTree構造のようなものでしょうか?

+0

は何ですデータ内の要素が表示される順番についてはわかっていますか? –

+1

あなたはdictのさまざまな要素で同じキーを使用することはできません。 ;) – alfasin

+1

Python辞書には一意のキーが必要です。 '{'ID':1、 'ID':2}'のようなものを定義しようとすると、2番目の '' ID ''が最初のものを上書きするので、 '{'ID':2} 。 –

答えて

2

childparentタプルを単純に反復して、子のIDと親をこれらの要素の子を含むリストにマップする辞書を作成できます。私たちはこれが終わるまでこれを続けます。

今、私たちは rootsは、樹木の根のIDの集合である、ことを行っていることを
roots = set() 
mapping = {} 
for child,parent in data: 
    childitem = mapping.get(child,None) 
    if childitem is None: 
     childitem = {} 
     mapping[child] = childitem 
    else: 
     roots.discard(child) 
    parentitem = mapping.get(parent,None) 
    if parentitem is None: 
     mapping[parent] = {child:childitem} 
     roots.add(parent) 
    else: 
     parentitem[child] = childitem 

:そう、そのような各要素のために、私たちは親であるIDがないことを知っています。 rootsのIDごとに、単純にmappingから取得できます。これは構造{'childid':child}の辞書です。ここで、childidはid(ここではstring)であり、childは再びその形式の辞書です。

だから、あなたのようにそれらを印刷することができます。

for root in roots: 
    print(mapping[root]) 

だからあなたの場合には、treeがある:あなたのサンプルdataについては

tree = { id : mapping[id] for id in roots } 

、それが生成する:

>>> tree 
{'R1': {'P1': {'C1': {'E1': {}}}, 'P2': {'C2': {'E2': {}}, 'C3': {}}}, 'R2': {'P4': {'C6': {'E4': {}}}, 'P3': {'C5': {}, 'C4': {'E3': {}}}}, 'R3': {'P6': {'C8': {}, 'C9': {'E6': {}}}, 'P5': {'C7': {'E5': {}}}}, 'R4': {'P8': {'C12': {'E8': {}}}, 'P7': {'C11': {}, 'C10': {'E7': {}}}}} 
+0

あなたの入力をありがとう、出力ツリーは不完全なようです、例えばP4は子C6を持ち、C9などのIDはなくて、多くは実際には見つからない – citizen2077

+0

@new_to_coding:あなたは正しいです。私はそのバグを見つけました。今それは動作するはずです。 –

+0

これは間違いありません、ご協力いただきありがとうございます! – citizen2077

関連する問題