Mehrere Elemente "stilvoll" aus Listen entfernen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
el_bobo
User
Beiträge: 23
Registriert: Dienstag 15. Januar 2008, 02:11

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
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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("#")]
el_bobo
User
Beiträge: 23
Registriert: Dienstag 15. Januar 2008, 02:11

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

el_bobo hat geschrieben:Bin ja fast gespannt was es da noch so alles gibt. :-)
[wiki=Neue Features#ListComprehensions]Vieles[/wiki].
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
el_bobo
User
Beiträge: 23
Registriert: Dienstag 15. Januar 2008, 02:11

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten