2010-11-24 20 views
1

Ich habe eine Ausgabe (eine Liste) von Elementen, wie solche:einen durch Leerzeichen getrennten Baum zu nützlicher dict in Python

Root 
    Branch1 
    LeafA 
    LeafB 
    Branch2 
    LeafC 
     LeafZ 
    LeafD 

Sie sind alle Zweiräume begrenzt. Ich möchte eine logische Darstellung dieser Liste ohne die führenden Leerzeichen erstellen und das Eltern-Kind-Verhältnis behalten.

Eine letzte mögliche Ergebnis:

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

Letztlich möchte ich durch das Wörterbuch iterieren und den Schlüssel und Eltern, sowie einen anderen Wert aus einem anderen auf Key basiert dict abzurufen.

+2

Ihre mögliche Endergebnis ist nicht gültig Python. Möchten Sie es überarbeiten? – nmichaels

+0

Guter Punkt, überarbeitet. –

Antwort

4

Try this:

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

Das macht den Trick! –

+0

+1 für 'indent = (len (line) - len (key))/2' – lalli

0

Ich denke, das das Problem löst:

 
#!/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""") 

Ausgang:

 
{'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} 
Verwandte Themen