Estoy tratando de construir un árbol general.
¿Hay alguna estructura de datos incorporada en Python para implementarla?
python
data-structures
tree
vishnu
fuente
fuente
Respuestas:
anytree
Recomiendo https://pypi.python.org/pypi/anytree (soy el autor)
Ejemplo
Caracteristicas
anytree también tiene una potente API con:
fuente
anytree
es probablemente una gran biblioteca, esta es una pregunta de Python, no una pregunta de Node.js.Python no tiene la amplia gama de estructuras de datos "incorporadas" que tiene Java. Sin embargo, debido a que Python es dinámico, un árbol general es fácil de crear. Por ejemplo, un árbol binario podría ser:
Puedes usarlo así:
fuente
class Tree
del objetoobject
veces es solo una pauta: si una clase hereda de ninguna otra clase base, herede explícitamente del objeto. Esto también se aplica a las clases anidadas. Consulte la Guía de estilo de Google PythonUn árbol genérico es un nodo con cero o más hijos, cada uno de ellos un nodo (árbol) adecuado. No es lo mismo que un árbol binario, son estructuras de datos diferentes, aunque ambas comparten alguna terminología.
No hay ninguna estructura de datos integrada para árboles genéricos en Python, pero se implementa fácilmente con clases.
fuente
Puedes probar:
Como se sugiere aquí: https://gist.github.com/2012250
fuente
fuente
No hay árboles incorporados, pero puede construir uno fácilmente subclasificando un tipo de Nodo de la Lista y escribiendo los métodos de recorrido. Si haces esto, he encontrado que bisect es útil.
También hay muchas implementaciones en PyPi que puede explorar.
Si recuerdo correctamente, la lib estándar de Python no incluye estructuras de datos de árbol por la misma razón que la biblioteca de clases base .NET no: la localidad de memoria se reduce, lo que resulta en más errores de caché. En los procesadores modernos, generalmente es más rápido llevar una gran cantidad de memoria al caché, y las estructuras de datos "ricas en punteros" niegan el beneficio.
fuente
Implementé un árbol rooteado como diccionario
{child:parent}
. Entonces, por ejemplo, con el nodo raíz0
, un árbol podría verse así:Esta estructura hizo que fuera bastante fácil ir hacia arriba a lo largo de una ruta desde cualquier nodo a la raíz, lo cual era relevante para el problema en el que estaba trabajando.
fuente
{parent:[leftchild,rightchild]}
.La respuesta de Greg Hewgill es excelente, pero si necesita más nodos por nivel, puede usar una lista | diccionario para crearlos: y luego usar el método para acceder a ellos por nombre u orden (como id)
Ahora solo cree una raíz y compílela: ej:
Eso debería ser suficiente para que comiences a descubrir cómo hacer que esto funcione
fuente
funciona como un diccionario, pero proporciona tantos dictados anidados que desee. Intenta lo siguiente:
entregará un dictado anidado ... que realmente funciona como un árbol.
... Si ya tienes un dict, lanzará cada nivel a un árbol:
De esta manera, puede seguir editando / agregando / eliminando cada nivel de dictado como lo desee. Todos los métodos dict para transversal, etc., todavía se aplican.
fuente
dict
lugar dedefaultdict
? Según mis pruebas, extender endefaultdict
lugar de dict y luego agregarself.default_factory = type(self)
a la parte superior de init debería funcionar de la misma manera.He implementado árboles usando dictados anidados. Es bastante fácil de hacer y me ha funcionado con conjuntos de datos bastante grandes. He publicado una muestra a continuación, y puedes ver más en el código de Google
fuente
He publicado una implementación de árbol Python [3] en mi sitio: http://www.quesucede.com/page/show/id/python_3_tree_implementation .
Espero que sea de utilidad,
Ok, aquí está el código:
fuente
Si alguien necesita una forma más simple de hacerlo, un árbol es solo una lista anidada recursivamente (ya que el conjunto no es hashable):
Donde cada rama es un par:
[ object, [children] ]
y cada hoja es un par:
[ object, [] ]
Pero si necesita una clase con métodos, puede usar anytree.
fuente
¿Qué operaciones necesitas? A menudo hay una buena solución en Python usando un dict o una lista con el módulo bisect.
Hay muchas, muchas implementaciones de árbol en PyPI , y muchos tipos de árbol son casi triviales para implementarse en Python puro. Sin embargo, esto rara vez es necesario.
fuente
Otra implementación de árbol basada libremente en la respuesta de Bruno :
Y un ejemplo de cómo usarlo:
Cuál debería dar salida:
fuente
Sugiero la biblioteca de networkx .
Un ejemplo de construcción de un árbol:
No estoy seguro de lo que quiere decir con un " árbol general ",
pero la biblioteca permite que cada nodo sea un objeto hashaable , y no hay restricción en el número de hijos que tiene cada nodo.
La biblioteca también proporciona algoritmos gráficos relacionados con árboles y capacidades de visualización .
fuente
Si desea crear una estructura de datos de árbol, primero debe crear el objeto treeElement. Si crea el objeto treeElement, puede decidir cómo se comporta su árbol.
Para hacer esto a continuación es la clase TreeElement:
Ahora, tenemos que usar este elemento para crear el árbol, estoy usando el árbol A * en este ejemplo.
Puede agregar / eliminar cualquier elemento del objeto, pero intente la estructura.
fuente
fuente