First we parse the string:
data = """A
A -> B -> C -> D -> Z
A -> B -> O
A -> X
"""
lines = [x.split(' -> ') for x in data.split('\n') if x]
This will return
[['A'], ['A', 'B', 'C', 'D', 'Z'], ['A', 'B', 'O'], ['A', 'X']]
Then we build it:
def addone(owner, data):
o = owner.setdefault(data.pop(0), {})
if data:
addone(o, data)
root = {}
for line in lines:
addone(root, line)
Now the root will be:
{'A': {'X': {}, 'B': {'C': {'D': {'Z': {}}}, 'O': {}}}}
Finally we display it:
def show(base, data):
while data:
k, v = data.pop(0)
print '%s|-%s' % (base, k)
if v:
if data:
show(base + '| ', v.items())
else:
show(base + ' ', v.items())
show("", root.items())
It will output on my place like this:
|-A
|-X
|-B
|-C
| |-D
| |-Z
|-O
O and C has different order, because python dict not remember order, which is easy to change by sort or use collections.OrderedDict
['A', 'A -> B -> C -> D -> Z', 'A -> B -> O', 'A -> X']?