2017-10-21 51 views
2

Je suis en train de tracer des données (groupes de pays par leurs distances) avec un dendrogramme texte simple qui afficherait dans mon terminal comme celui-ci:Comment afficher un dendrogramme de texte simple dans le terminal?

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

J'ai données stockées dans une matrice de paires de clusters avec leurs distances, appelées draw_clusters, et il ressemble à ceci:

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

jusqu'à présent, j'écrit ce code, mais je ne sais pas comment appeler la fonction récursive afin qu'il tracer le texte dendrogramme dans le terminal:

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) 

Quelqu'un peut-il m'aider avec des conseils, parce que je suis nouveau à Python et je ne suis pas vraiment sûr comment la récursivité devrait fonctionner?

+0

Est-ce un arbre toujours binaire? est la troisième valeur numérique dans chaque liste en quelque sorte utilisé? Pouvez-vous donner un exemple plus court mais non tronqué de votre matrice? –

Répondre

1

J'étais un peu confus avec la structure de votre matrice. J'ai donc dû faire quelques suppositions, comme chaque liste représente un nœud binaire, les deux premières valeurs pourraient conduire à des nœuds plus récents, et la troisième valeur numérique n'est pas utilisée dans votre dendrogramme.

Si le ci-dessous est une matrice valide:

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

Vous pouvez facilement imprimer est dendrogramme avec:

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) 

qui produira une sortie comme ceci:

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