如何在终端中显示简单的文本树形图?

时间:2017-10-21 11:36:07

标签: python recursion text hierarchical-clustering dendrogram

我试图用一个简单的文本树形图来绘制一些数据(国家组的距离),这些数据将在我的终端中显示如下:

                ---- Monaco
        ----|
                ---- Croatia
            ----|
                ---- Montenegro
    ----|
            ---- Serbia
        ----|
            ---- Slovenia
----|
            ---- Austria
        ----|
                ---- Switzerland
            ----|
                ---- Germany
    ----|
                    ---- Belgium
                ----|
                        ---- Netherlands
                    ----|
                        ---- France
            ----|
                    ---- Sweden
                ----|
                        ---- Denmark
                    ----|
                        ---- Norway

我将数据存储在一组具有距离的簇的矩阵中,称为draw_clusters,它看起来像这样:

['Monaco', [[[[['Croatia ', 'Montenegro ', 1.9148542155126762], ['Serbia ', 'Slovenia ', 2.469532658074352], 2.6659130840453282], ['Austria ', ['Switzerland ', 'Germany', 1.8487591643481294], 2.843561940573178], 3.3080033351363003],['...', '...']...[...]]

到目前为止,我编写了这段代码,但我不知道如何递归调用函数,以便将文本树形图绘制到终端:

def draw_dendrogram(draw_clusters):
    for cluster in range(len(draw_clusters)):
        dendrogram(draw_clusters[cluster], 0, 0, 0)

def dendrogram(cluster, x, y, distance):
    node = "|"
    vertical_line = "---"

    print(cluster)

任何人都可以帮我提供任何提示,因为我是Python的新手,我不确定递归应该如何工作?

1 个答案:

答案 0 :(得分:1)

我对矩阵的结构有点困惑。所以我需要做一些假设,比如每个列表代表一个二进制节点,前两个值可能会导致更新的节点,并且你的树形图中不会使用第三个数值。

如果以下是有效矩阵:

mat = [
        [   ['Croatia ', 'Montenegro ', 1.9148542155126762],
            ['Serbia ', 'Slovenia ', 2.469532658074352],
            2.6659130840453282],
        ['Austria ',
            ['Switzerland ', 'Germany', 1.8487591643481294],
            2.843561940573178],
        4.5656]

您可以使用以下方法轻松打印树形图:

def print_node(data,spaces = ""):
    if type(data)==type([]):
        print_node(data[0],spaces+" "*5) #here is first recursive call
        print(spaces,"----|")
        print_node(data[1],spaces+" "*5) #second recursive call
    else:
        print(spaces,"----",data)

这会产生这样的输出:

                ---- Croatia 
           ----|
                ---- Montenegro 
      ----|
                ---- Serbia 
           ----|
                ---- Slovenia 
 ----|
           ---- Austria 
      ----|
                ---- Switzerland 
           ----|
                ---- Germany