Seite 1 von 1

Mehrere Elemente "stilvoll" aus Listen entfernen

Verfasst: Dienstag 15. Januar 2008, 02:22
von el_bobo
Hallo zusammen,

ich bin leider noch nicht allzu sehr vertraut mit Python und habe momentan ein Problem.
Ich habe Dateiinput mit Kommentarzeilen und möchte diese entfernen.
Nun funktioniert aber offensichtlich folgender Code nicht:

Code: Alles auswählen

for line in lines:
  if line.startswith("#"): lines.remove(line)
Ich hatte wohl mal gelesen, dass man in Python "for a in b" immer einem Durchlauf mit Index vorziehen solle, zwecks Performance.
Intern läuft das aber anscheinend doch über Indizes, da bei obrigem Code nur jede 2. Zeile entfernt wird (bei zusammenhängenden Kommentaren).

Nun die eigentliche Frage: wie lässt sich das schön lösen? Gibt es einen Python-spezifischen Weg?

Klar kann man einen Laufindex verwenden und diesen bei einer Löschung dekrementieren, aber schön ist das nicht.

Im Moment mache ich es so:

Code: Alles auswählen

toRemove = []
for line in lines:
  if line.startswith("#"): toRemove.append(line)
for line in toRemove: lines.remove(line)
Aber schön ist das auch nicht...

Bin für Hilfe dankbar.

Grüße,
el_bobo

Verfasst: Dienstag 15. Januar 2008, 06:24
von Zap
Guten Morgen el_bobo.

Der Gedanke ist einfach anders:
Man löscht nicht sondern erstellt einfach eine neue Liste. Kommt auf das selbe raus. Man muss lediglich die Bedingung umkehren. ;)

Code: Alles auswählen

lines = [line for line in lines if not line.startswith("#")]

Verfasst: Dienstag 15. Januar 2008, 20:40
von el_bobo
Oh das

Code: Alles auswählen

[a for a in b]
kannte ich gar nicht.
Bin ja fast gespannt was es da noch so alles gibt. :-)

Danke auf jeden Fall und Grüße.

Verfasst: Dienstag 15. Januar 2008, 23:22
von Leonidas
el_bobo hat geschrieben:Bin ja fast gespannt was es da noch so alles gibt. :-)
[wiki=Neue Features#ListComprehensions]Vieles[/wiki].

Verfasst: Mittwoch 16. Januar 2008, 04:37
von el_bobo
Ui da gibt es ja wirklich einige interessante Konstrukte.

Ich wusste zum Beispiel auch nicht, dass leere Listen False sind. (Stand glaub ich in PEP 8.) Das ist natürlich sehr praktisch.

Ehrlich gesagt kannte ich auch enumerate nicht.

Also das:

Code: Alles auswählen

for i, item in enumerate(liste):
    ...
Auch sehr praktisch eigentlich.

Wo wir gerade dabei sind:

Ich will gewisse Blöcke aus einer Datei in individuelle Listen zusammenfassen.

Die Datei sieht folgendermaßen aus:
bla bla
anfang
bla
bla
ende
bla
anfang
bla
ende
Interessant sind dabei nur die Blöcke, die durch "anfang" und "ende" eingeschlossen sind.

Bisher mache ich das so:

Code: Alles auswählen

aktuellerBlock = []
alleBloecke = []
for line in lines:
    if "anfang" in line: aktuellerBlock = []
    aktuellerBlock.append(line)
    if "}" in line: alleBloecke.append(aktuellerBlock)
Aber so wirklich schön ist das auch nicht.
Ginge das irgendwie besser?

Danke schon mal und Grüße,
el_bobo

Verfasst: Mittwoch 16. Januar 2008, 10:09
von Leonidas
el_bobo hat geschrieben:Ginge das irgendwie besser?
Wie wärs mit

Code: Alles auswählen

re.findall(r'anfang\n(.*?)\nende', re.DOTALL)
Alternativ kannst du dir auch mit, hmm, etwa PyParsing einen ad-hoc Parser bauen.