Dies ist das Beispielformular, ich werde es später in Worten erklären. Ich habe eine Liste von einer Kette auflösen ...
sagen
%Vor%wobei b das Kriterium 1 und c das Kriterium 2 ist
Ich möchte es in eine Liste wie folgt aufteilen:
%Vor%Also möchte ich die Zeichenfolge so verarbeiten, dass, wenn das Element mit Kriterium 1 übereinstimmt, eine neue Liste geöffnet wird, wenn Element mit Kriterium 2 übereinstimmt, die Liste schließt und eine Ebene darüber zurückkehrt.
Ich habe versucht, so etwas zu tun, aber es funktioniert nicht sehr gut.
%Vor%Ich habe gesehen, dass die Liste vor dem stackoverflow in eine gleich große Liste geteilt wurde, aber nicht in eine Unterliste, die eine Reihe von Kriterien verwendet.
Ich bin ziemlich neu bei Python, daher bin ich mit den Datenstrukturen und Iterator-Tools nicht vertraut.
Das obige funktioniert, solange Ihre b
und c
Trennzeichen ausgeglichen sind. Insbesondere wenn Sie einen Überhang von c
s haben, haben Sie einen Stapel-Unterlauf.
Obwohl ich häufig rekursive Lösungen mag, hat dies den Vorteil, dass der Stack explizit gemacht wird, was in diesem Fall meiner Meinung nach zu einem einfacheren Code führt.
Es gibt sehr schöne Antworten auf diese Frage, besonders mochte ich die rekursive Lösung von thg435, die Generatoren verwendet, und Marcins iterative Lösung, die Elemente zu referenzierten Listen hinzufügt.
Ich fand auch beunruhigend, dass einige Lösungen die Eingabeliste modifizieren oder den globalen Status verwenden. Das, IMHO, widerspricht dem wahren Geist einer rekursiven Lösung. Nachstehend mein Versuch einer rein funktionalen, rekursiven Lösung in Python - es gibt zwar viel mehr idiomatische und effiziente Möglichkeiten, dieses Problem zu lösen, aber ich wollte eine Antwort schreiben, wie ich es in einer rein funktionalen Programmiersprache geschrieben hätte:
%Vor%Einige Details zu beachten:
append
oder extend
(die None
zurückgeben) werden vermieden