monticulo - Imprimir una estructura de datos de árbol en Python
hacer un arbol en python (2)
Estaba buscando una posible implementación de la impresión de árbol, que imprime el árbol de una manera fácil de usar, y no como una instancia de objeto.
Me encontré con esta solución en la red:
fuente: http://cbio.ufs.ac.za/live_docs/nbn_tut/trees.html
class node(object):
def __init__(self, value, children = []):
self.value = value
self.children = children
def __repr__(self, level=0):
ret = "/t"*level+repr(self.value)+"/n"
for child in self.children:
ret += child.__repr__(level+1)
return ret
Este código imprime el árbol de la siguiente manera:
''grandmother''
''daughter''
''granddaughter''
''grandson''
''son''
''granddaughter''
''grandson''
¿Es posible tener el mismo resultado pero sin cambiar el método __repr__
Porque lo estoy usando para otro propósito.
EDITAR:
Solución sin modificar __repr__
y __str__
def other_name(self, level=0):
print ''/t'' * level + repr(self.value)
for child in self.children:
child.other_name(level+1)
Sí, mueva el código __repr__
a __str__
, luego llame a str()
en su árbol o páselo a la instrucción de print
. Recuerde usar __str__
en las llamadas recursivas también:
class node(object):
def __init__(self, value, children = []):
self.value = value
self.children = children
def __str__(self, level=0):
ret = "/t"*level+repr(self.value)+"/n"
for child in self.children:
ret += child.__str__(level+1)
return ret
def __repr__(self):
return ''<tree node representation>''
Manifestación:
>>> root = node(''grandmother'')
>>> root.children = [node(''daughter''), node(''son'')]
>>> root.children[0].children = [node(''granddaughter''), node(''grandson'')]
>>> root.children[1].children = [node(''granddaughter''), node(''grandson'')]
>>> root
<tree node representation>
>>> str(root)
"''grandmother''/n/t''daughter''/n/t/t''granddaughter''/n/t/t''grandson''/n/t''son''/n/t/t''granddaughter''/n/t/t''grandson''/n"
>>> print root
''grandmother''
''daughter''
''granddaughter''
''grandson''
''son''
''granddaughter''
''grandson''
¿Por qué no lo almacena como un objeto treelib y lo imprime de manera similar a cómo imprimimos el árbol CHAID aquí con descripciones de nodos más relevantes relacionados con su caso de uso?
([], {0: 809, 1: 500}, (sex, p=1.47145310169e-81, chi=365.886947811, groups=[[''female''], [''male'']]))
├── ([''female''], {0: 127, 1: 339}, (embarked, p=9.17624191599e-07, chi=24.0936494474, groups=[[''C'', ''<missing>''], [''Q'', ''S'']]))
│ ├── ([''C'', ''<missing>''], {0: 11, 1: 104}, <Invalid Chaid Split>)
│ └── ([''Q'', ''S''], {0: 116, 1: 235}, <Invalid Chaid Split>)
└── ([''male''], {0: 682, 1: 161}, (embarked, p=5.017855245e-05, chi=16.4413525404, groups=[[''C''], [''Q'', ''S'']]))
├── ([''C''], {0: 109, 1: 48}, <Invalid Chaid Split>)
└── ([''Q'', ''S''], {0: 573, 1: 113}, <Invalid Chaid Split>)