Ich versuche einen allgemeinen Baum zu konstruieren.
Gibt es in Python integrierte Datenstrukturen, um diese zu implementieren?
python
data-structures
tree
vishnu
quelle
quelle
Antworten:
anytree
Ich empfehle https://pypi.python.org/pypi/anytree (ich bin der Autor)
Beispiel
Eigenschaften
anytree hat auch eine leistungsstarke API mit:
quelle
anytree
es sich wahrscheinlich um eine großartige Bibliothek handelt, handelt es sich um eine Python-Frage, nicht um eine Node.js-Frage.Python verfügt nicht über die umfangreiche Auswahl an "integrierten" Datenstrukturen wie Java. Da Python jedoch dynamisch ist, ist es einfach, einen allgemeinen Baum zu erstellen. Ein Binärbaum könnte beispielsweise sein:
Sie können es so verwenden:
quelle
class Tree
vom Objekt abzuleitenobject
ist manchmal nur eine Richtlinie: Wenn eine Klasse von keiner anderen Basisklasse erbt, erbt sie explizit vom Objekt. Dies gilt auch für verschachtelte Klassen. Siehe Google Python Style GuideEin generischer Baum ist ein Knoten mit null oder mehr untergeordneten Knoten, von denen jeder ein richtiger (Baum-) Knoten ist. Es ist nicht dasselbe wie ein Binärbaum, es handelt sich um unterschiedliche Datenstrukturen, obwohl beide eine bestimmte Terminologie haben.
In Python gibt es keine integrierte Datenstruktur für generische Bäume, diese lässt sich jedoch problemlos mit Klassen implementieren.
quelle
Du kannst es versuchen:
Wie hier vorgeschlagen: https://gist.github.com/2012250
quelle
quelle
Es sind keine Bäume eingebaut, aber Sie können einfach einen erstellen, indem Sie einen Knotentyp aus List unterordnen und die Traversal-Methoden schreiben. Wenn Sie dies tun, habe ich Bisekt nützlich gefunden.
Es gibt auch viele Implementierungen auf PyPi , die Sie durchsuchen können.
Wenn ich mich richtig erinnere, enthält die Python-Standardbibliothek keine Baumdatenstrukturen aus demselben Grund wie die .NET-Basisklassenbibliothek: Die Speicherlokalität wird reduziert, was zu mehr Cache-Fehlern führt. Auf modernen Prozessoren ist es normalerweise schneller, nur einen großen Teil des Speichers in den Cache zu bringen, und "zeigerreiche" Datenstrukturen negieren den Vorteil.
quelle
Ich habe einen verwurzelten Baum als Wörterbuch implementiert
{child:parent}
. So könnte beispielsweise mit dem Wurzelknoten0
ein Baum folgendermaßen aussehen:Diese Struktur machte es ziemlich einfach, auf einem Pfad von einem beliebigen Knoten zur Wurzel nach oben zu gehen, was für das Problem, an dem ich arbeitete, relevant war.
quelle
{parent:[leftchild,rightchild]}
.Greg Hewgills Antwort ist großartig, aber wenn Sie mehr Knoten pro Ebene benötigen, können Sie sie mit einem Listenwörterbuch erstellen: Verwenden Sie dann die Methode, um entweder nach Name oder Reihenfolge (wie ID) auf sie zuzugreifen.
Erstellen Sie jetzt einfach eine Wurzel und bauen Sie sie auf: Beispiel:
Das sollte ausreichen, damit Sie herausfinden, wie dies funktioniert
quelle
Funktioniert als Wörterbuch, bietet jedoch so viele verschachtelte Wörter, wie Sie möchten. Versuche Folgendes:
wird ein verschachteltes Diktat liefern ... das in der Tat als Baum funktioniert.
... Wenn Sie bereits ein Diktat haben, wird jedes Level auf einen Baum gewirkt:
Auf diese Weise können Sie jede Diktatstufe nach Ihren Wünschen bearbeiten / hinzufügen / entfernen. Alle Diktiermethoden für das Durchqueren usw. gelten weiterhin.
quelle
dict
stattdefaultdict
? Nach meinen Tests sollte das Erweiterndefaultdict
anstelle des Diktierens und das Hinzufügenself.default_factory = type(self)
zum Anfang von init auf die gleiche Weise funktionieren.Ich habe Bäume mit verschachtelten Diktaten implementiert. Das ist ganz einfach und hat bei mir mit ziemlich großen Datenmengen funktioniert. Ich habe unten ein Beispiel gepostet, und Sie können mehr unter Google-Code sehen
quelle
Ich habe eine Python [3] -Baumimplementierung auf meiner Website veröffentlicht: http://www.quesucede.com/page/show/id/python_3_tree_implementation .
Hoffe, es ist von Nutzen,
Ok, hier ist der Code:
quelle
Wenn jemand einen einfacheren Weg benötigt, ist ein Baum nur eine rekursiv verschachtelte Liste (da set nicht hashbar ist):
Wobei jeder Zweig ein Paar ist: [Objekt, [Kinder]]
und jedes Blatt ein Paar ist: [Objekt, []]
Wenn Sie jedoch eine Klasse mit Methoden benötigen, können Sie anytree verwenden.
quelle
Welche Operationen benötigen Sie? In Python gibt es oft eine gute Lösung, wenn Sie ein Diktat oder eine Liste mit dem Halbierungsmodul verwenden.
Es gibt viele, viele Baumimplementierungen auf PyPI , und viele Baumtypen sind fast trivial, um sich in reinem Python zu implementieren. Dies ist jedoch selten notwendig.
quelle
Eine weitere Baumimplementierung basiert lose auf Brunos Antwort :
Und ein Beispiel für die Verwendung:
Welches sollte ausgeben:
quelle
Ich schlage die networkx Bibliothek vor.
Ein Beispiel für das Bauen eines Baumes:
Ich bin nicht sicher, was Sie unter einem " allgemeinen Baum" verstehen ,
aber die Bibliothek ermöglicht es jedem Knoten, ein beliebiges hashbares Objekt zu sein , und es gibt keine Einschränkung hinsichtlich der Anzahl der untergeordneten Knoten, die jeder Knoten hat.
Die Bibliothek bietet auch Diagrammalgorithmen für Bäume und Visualisierungsfunktionen .
quelle
Wenn Sie eine Baumdatenstruktur erstellen möchten, müssen Sie zuerst das treeElement-Objekt erstellen. Wenn Sie das treeElement-Objekt erstellen, können Sie entscheiden, wie sich Ihr Baum verhält.
Dazu folgt die TreeElement-Klasse:
Jetzt müssen wir dieses Element verwenden, um den Baum zu erstellen. In diesem Beispiel verwende ich den A * -Baum.
Sie können beliebige Elemente zum Objekt hinzufügen / daraus entfernen, die Struktur jedoch intect.
quelle
quelle