如何在python中解析和打印树

问题描述 投票:1回答:2

目前我有以下格式的数据

A
A -> B -> C -> D -> Z
A -> B -> O
A -> X

这存储在列表[line1,line2等]中

现在我想以下面的方式打印它

 A
 |- X
 |- B
    |- O
    |- C
       |- D
          |- Z

我是python的新手。我想在数组中的每个元素中找到' - >'并用空格替换。我不知道要往前走。

python python-3.x tree binary-tree pretty-print
2个回答
1
投票

这里有一些小代码可以帮助您入门(根据需要添加自己的美化):

>>> def make_links(data):
        'Create a dictionary mapping nodes to a set of their successors'
        links = {}
        for row in data:
            nodes = row.replace(' ', '').split('->')
            for a, b in zip(nodes[:-1], nodes[1:]):
                links.setdefault(a, set()).add(b)
        return links

>>> def draw_tree(links, start, depth=0):
        'Recursively print a tree from a given starting point and given depth'
        print('   ' * depth + start)
        for node in sorted(links.get(start, [])):
            draw_tree(links, node, depth+1)

>>> data = ['A', 'A -> B -> C -> D -> Z', 'A -> B -> O', 'A -> X']

>>> links = make_links(data)
>>> links
{'A': {'X', 'B'}, 'C': {'D'}, 'B': {'C', 'O'}, 'D': {'Z'}}

>>> draw_tree(links, start='A')
A
   B
      C
         D
            Z
      O
   X

1
投票

首先我们解析字符串:

data = """A
    A -> B -> C -> D -> Z
    A -> B -> O
    A -> X
    """

lines = [x.split(' -> ') for x in data.split('\n') if x]

这将返回

[['A'], ['A', 'B', 'C', 'D', 'Z'], ['A', 'B', 'O'], ['A', 'X']]

然后我们建立它:

def addone(owner, data):
    o = owner.setdefault(data.pop(0), {})
    if data:
        addone(o, data)

root = {}
for line in lines:
    addone(root, line)

现在根将是:

{'A': {'X': {}, 'B': {'C': {'D': {'Z': {}}}, 'O': {}}}}

最后我们展示它:

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())

它将在我的地方输出如下:

|-A
  |-X
  |-B
    |-C
    | |-D
    |   |-Z
    |-O

O和C有不同的顺序,因为python dict不记得顺序,很容易通过排序或使用collections更改.OrderedDict

© www.soinside.com 2019 - 2024. All rights reserved.