So bearbeiten Sie eine Zeichenfolge in eine Ebene von Unterlisten

8

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.

    
chemelnucfin 02.05.2012, 14:25
quelle

7 Antworten

10

hier gehen Sie:

%Vor%     
georg 02.05.2012, 14:42
quelle
1
%Vor%

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.

    
Marcin 02.05.2012 14:33
quelle
1

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:

  • Ich verwende keine lokalen Variablen oder globale Variablen, sondern nur Funktionsparameter zur Verfolgung des Status
  • Ich verwende keine Zuweisungsoperatoren
  • Zum Durchlaufen der Eingabeliste werden keine Iteratoren oder Schleifen verwendet, nur Rekursion
  • Es ist eine Tail-rekursive Lösung, obwohl das in Python
  • irrelevant ist
  • Nur Ausdrücke werden verwendet; Operationen wie append oder extend (die None zurückgeben) werden vermieden
  • Keine Listen werden jemals geändert (einschließlich der Eingabeliste), stattdessen werden neue Listen nach Bedarf erstellt (mit Array-Slices dafür)
  • Es ist eine ziemlich kurze und elegante Lösung, aber das könnte eine subjektive Meinung sein:)
Óscar López 03.05.2012 05:05
quelle
1

mit einem Stapel:

%Vor%

dies wird brechen, wenn mehr 'c's als' b's

sind     
sobel 02.05.2012 15:06
quelle
0

Folgendes wird es tun:

%Vor%

Beachten Sie, dass dies den Nebeneffekt hat, l zu ändern. Es ist trivial, das zu ändern, indem man eine Kopie macht.

    
NPE 02.05.2012 14:38
quelle
0

Im echten Rekursionsstil könnten Sie Folgendes tun:

%Vor%

Beachten Sie die Verwendung von Globals. Eine Reihe von Kritikern könnte dagegen als schlechter Programmierstil einwenden.

    
cobie 02.05.2012 16:10
quelle
0
%Vor%     
fraxel 02.05.2012 16:44
quelle

Tags und Links