Python-Datei Parsen: Build-tree von text-Datei
Habe ich einen eingerückten text-Datei, die verwendet werden, um zu bauen, einen Baum. Jede Zeile repräsentiert einen Knoten und Einzüge stellen sowohl Tiefe als auch Knoten, der aktuelle Knoten ist ein Kind.
Beispielsweise eine Datei Aussehen könnte
ROOT Node1 Node2 Knoten3 Knoten4 Knoten5 Node6
Was bedeutet, dass ROOT enthält drei Kinder: 1, 5, und 6, Node1 hat ein Kind: 2, und Knoten 2 hat ein Kind: 3, etc.
Habe ich kommen mit einem rekursiven Algorithmus und haben es programmiert, und es funktioniert, aber es ist irgendwie hässlich und vor allem behandelt das Beispiel oben sehr grob (wenn man vom Knoten 4 zum Knoten 5)
Setzt es ein "indent-count" als Grundlage für die Rekursion, so dass, wenn die Anzahl der Einzüge = aktuelle Tiefe + 1, würde ich eine Ebene tiefer. Aber das bedeutet, wenn ich lese eine Zeile, die mit weniger abdrücken, ich habe wieder zu kommen, bis eine Ebene in einer Zeit, die überprüfung der Tiefe jedes mal.
Hier ist, was ich haben
def _recurse_tree(node, parent, Tiefe): tabs = 0 während Knoten: tabs = Knoten.count("\t") wenn tabs == Tiefe: print "%s: %s" %(parent.Streifen(), node.strip()) elif tabs == Tiefe + 1: Knoten = _recurse_tree(Knoten, prev, Tiefe+1) tabs = Knoten.count("\t") #überprüfen, ob wir auf der Oberfläche einige mehr wenn tabs == Tiefe: print "%s: %s" %(parent.Streifen(), node.strip()) sonst: return-Knoten sonst: return-Knoten prev = node Knoten = inFile.readline().rstrip() inFile = open("test.txt") root = inFile.readline().rstrip() Knoten = inFile.readline().rstrip() _recurse_tree(node, root, 1)
Jetzt bin ich nur den Druck aus den Knoten, um sicherzustellen, dass der übergeordnete Knoten ist korrekt für jede Zeile, aber vielleicht gibt es eine sauberere Möglichkeit, es zu tun? Vor allem der Fall in der elif-block, wenn ich komme zurück aus jeder Rekursion nennen.
InformationsquelleAutor der Frage That Umbrella Guy | 2011-05-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das große Problem ist die "lookahead" , denke ich, verursacht die Hässlichkeit in Frage. Es kann etwas verkürzt:
Da reden wir Rekursion, nahm ich Schmerzen zu vermeiden, alle globalen Variablen (
source
undlast_line
). Es wäre mehr pythonic machen Sie Mitglieder auf einige parser-Objekt.InformationsquelleAutor der Antwort Mu Mind
Wenn Sie nicht darauf bestehen, Rekursion, das funktioniert auch:
Ergebnis:
InformationsquelleAutor der Antwort pillmuncher
Ich würde keine Rekursion für so etwas überhaupt (Ok, vielleicht würde ich wenn ich die Programmierung dieses in einer Sprache wie Scheme, aber das ist Python hier). Rekursion ist ideal für die Iteration über die Daten, die geformt ist wie ein Baum, und in diesen Fällen würde es vereinfachen Sie Ihre Konstruktion erheblich, wenn im Vergleich zu normalen Schleifen.
Dies ist jedoch hier nicht der Fall. Ihre Daten sicher stellt einen Baumaber es formatiert ist sequentiell, d.h. es ist eine einfache Sequenz von Linien. Solche Daten werden am leichtesten verarbeitet werden, der mit einer einfachen Schleife, obwohl Sie könnten, machen das design mehr Allgemeinen, wenn Sie es wünschen, durch die Trennung in drei verschiedene Schichten: die sequentielle-reader analysiert die tabs als eine Spezifikation der Tiefe der Stufe), der Baum inserter (welcher ein Knoten in einem Baum in einer bestimmten Tiefe Ebene, die durch verfolgen der Letzte Knoten wurde eingefügt in den Baum und den Baum selbst:
Wenn ich hatte, um diesen code zu testen, bevor Sie einfügen hier, schrieb ich eine sehr einfache Funktion pretty-print der Baum, den ich lese-Speicher. Für diese Funktion, die natürlichste Sache war, Rekursion zu verwenden, natürlich, weil jetzt der Baum ist in der Tat dargestellt, die tree-Daten:
InformationsquelleAutor der Antwort Boaz Yaniv