2010-11-24 32 views
1

J'ai une sortie (une liste) des éléments, comme par exemple:Convertir un arbre délimité par l'espace pour dict utile en python

Root 
    Branch1 
    LeafA 
    LeafB 
    Branch2 
    LeafC 
     LeafZ 
    LeafD 

Ils sont délimités deux espaces. Je veux construire une représentation logique de cette liste sans les espaces de début, et conserver la parenthèse parent-enfant.

Un résultat possible final:

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

En fin de compte, je veux itérer le dictionnaire et récupérer la clé et des parents, ainsi qu'une autre valeur d'un autre dict basé sur la clé.

+2

Votre possible résultat final est pas valide Python. Vous voulez le réviser? – nmichaels

+0

Bon point, révisé. –

Répondre

4

Essayez ceci:

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

Cela fait l'affaire! –

+0

+1 pour 'indent = (len (ligne) - len (clé))/2' – lalli

0

Je suppose que cela résout le problème:

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

Sortie:

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