2010-11-24 39 views
1

我有一個項目的輸出(列表),像這樣的:轉換空間分隔的樹有用的字典在python

Root 
    Branch1 
    LeafA 
    LeafB 
    Branch2 
    LeafC 
     LeafZ 
    LeafD 

他們都分隔兩空間。 我想建立一個沒有前導空格的列表的邏輯表示,並保留父子關係。

最終可能的結果:

aDict = { 
    'Root': null, 
    'Branch1': 'Root', 
    'LeafA': 'Branch1', 
... so on and so forth 
} 

最後,我想通過字典來遍歷和檢索關鍵和家長,以及基於主要來自另一個字典另一個值。

+2

你可能最後的結果是不是有效的Python。謹慎修改它? – nmichaels 2010-11-24 20:02:58

+0

好點,修改。 – 2010-11-26 04:32:12

回答

4

試試這個:

tree = """Root 
    Branch1 
    LeafA 
    LeafB 
    Branch2 
    LeafC 
     LeafZ 
    LeafD""" 

aDict = {} 
iDict = {} 
for line in tree.split("\n"): 
    key = line.lstrip(" ") 
    indent = (len(line) - len(key))/2 
    if indent == 0: 
     aDict[key] = None 
    else: 
     aDict[key] = iDict[indent - 1] 
    iDict[indent] = key 

print aDict 
# {'LeafD': 'Branch2', 'LeafA': 'Branch1', 'Branch2': 'Root', 'LeafC': 'Branch2', 'LeafB': 'Branch1', 'Branch1': 'Root', 'Root': None, 'LeafZ': 'LeafC'} 
0

我想這解決了這個問題:

 
#!/usr/bin/env python 

def f(txt): 
    stack = [] 
    ret = {} 
    for line in txt.split('\n'): 
     a = line.split(' ') 
     level = len(a) - 1 
     key = a[-1] 
     stack = stack[:level] 
     ret[key] = stack[-1] if len(stack) > 0 else None 
     stack.append(key) 
    return ret 

print f("""Root 
    Branch1 
    LeafA 
    LeafB 
    Branch2 
    LeafC 
     LeafZ 
    LeafD""") 

print f("""Root1 
    Branch1 
    LeafA 
     LeftZ 
    Branch2 
    LeftB 
Root2 
    Branch3""") 

輸出:

 
{'LeafD': 'Branch2', 'LeafA': 'Branch1', 'Branch2': 'Root', 'LeafC': 'Branch2', 'LeafB': 'Branch1', 'Branch1': 'Root', 'Root': None, 'LeafZ': 'LeafC'} 
{'LeafA': 'Branch1', 'Branch2': 'Root1', 'Branch1': 'Root1', 'LeftZ': 'LeafA', 'LeftB': 'Branch2', 'Branch3': 'Root2', 'Root1': None, 'Root2': None}