Seite 1 von 1
mehrere leerzeichen durch ein leerzeichen ersetzen
Verfasst: Sonntag 1. Mai 2011, 16:05
von Chibi
Hi,
ich habe ein Problem und bin total verzweifelt, da ich irgendwie keine Lösung finde.
ich habe eine Datei eingelesen und diese an bestimmten stellen gesplittet, nun habe ich eine Liste mit den zeilen die ich benötige. Da es eine liste ist kann ich nur poisitionsweise den Befehl (replace()) anwenden, sobald ich eine schleife über diesen Befehl machen will, kann replace() nicht auf die Liste angewendet werden.
Wenn es doch positionsweise klappt, warum nicht auch über alle Positionen?
Code: Alles auswählen
daten1 = [x.split(" ") for x in daten]
daten2 = [x for x in daten1[1] if x.replace(' ','') ]
Beispiel der Daten:(- für Leerzeichen)
ABCD-----1--B--GGG-A usw. ist ein Listenelement
ABCD-----1--B--GGG-A
Das wird zu:
ABCD-1-B-GGG-A
aber leider nicht über alle Elemente.
hat da einer ne Idee?
Vielen dank
Re: mehrere leerzeichen durch ein leerzeichen ersetzen
Verfasst: Sonntag 1. Mai 2011, 16:53
von /me
Dein Code läuft ja auch gar nicht über alle Daten. Du greifst mit daten1[1] nur ein einziges Listenelement heraus.
Zudem sieht deine Darstellung so aus, als wolltest du nachher wieder Strings in der Liste erhalten. In dem Fall bietet sich folgendes an:
Code: Alles auswählen
import re
data = ['ABCD 1 B GGG A',
'ABCD 1 B GGG A']
data = [re.sub('\s{2,}', ' ', entry) for entry in data]
print data
Re: mehrere leerzeichen durch ein leerzeichen ersetzen
Verfasst: Sonntag 1. Mai 2011, 17:01
von Chibi
ich habe es so probiert, :
Code: Alles auswählen
daten1 = [x.split(" ") for x in daten]
for i in (len(daten1)):
daten2 = [x for x in daten1[i] if x.replace(' ','') ]
aber das klappt nicht..
Re: mehrere leerzeichen durch ein leerzeichen ersetzen
Verfasst: Sonntag 1. Mai 2011, 17:06
von /me
Chibi hat geschrieben:Code: Alles auswählen
daten1 = [x.split(" ") for x in daten]
for i in (len(daten1)):
daten2 = [x for x in daten1[i] if x.replace(' ','') ]
Ja ja, in der Verzweiflung fallen einem die einfachsten Fehler nicht auf.

Was erwartest du in daten2, wenn du das bei jedem Schleifendurchlauf an neue Daten bindest, statt zu erweitern?
Zudem ist ein Konstrukt wie
für Python äußerst umständlicher Code. Idiomatisch wäre
Re: mehrere leerzeichen durch ein leerzeichen ersetzen
Verfasst: Sonntag 1. Mai 2011, 17:10
von pillmuncher
Meinst du vielleicht das hier?
Code: Alles auswählen
daten2 = [y for x in daten for y in x.split(' ') if y]
Mit der data-Liste von /me kommt das heraus:
Code: Alles auswählen
['ABCD', '1', 'B', 'GGG', 'A', 'ABCD', '1', 'B', 'GGG', 'A']
Re: mehrere leerzeichen durch ein leerzeichen ersetzen
Verfasst: Sonntag 1. Mai 2011, 17:16
von derdon
Und hier noch eine andere Lösung:
Code: Alles auswählen
>>> s = '''ABCD 1 B GGG A
... ABCD 1 B GGG A'''
>>> '\n'.join(' '.join(line.split()) for line in s.splitlines())
'ABCD 1 B GGG A\nABCD 1 B GGG A'
>>> print _
ABCD 1 B GGG A
ABCD 1 B GGG A
Re: mehrere leerzeichen durch ein leerzeichen ersetzen
Verfasst: Sonntag 1. Mai 2011, 18:05
von Chibi
/me hat geschrieben:Dein Code läuft ja auch gar nicht über alle Daten. Du greifst mit daten1[1] nur ein einziges Listenelement heraus.
Zudem sieht deine Darstellung so aus, als wolltest du nachher wieder Strings in der Liste erhalten. In dem Fall bietet sich folgendes an:
Code: Alles auswählen
import re
data = ['ABCD 1 B GGG A',
'ABCD 1 B GGG A']
data = [re.sub('\s{2,}', ' ', entry) for entry in data]
print data
Vielen Dank perfekt, genau was ich gesucht habe, Stunden von Kopfzerbrechen zuende.
Bei den letzten beiden Vorschlägen habe ich immer den Fehler bekommen: 'list' object has no attribute 'splitlines',
hab ihr ne Erklärung dafür, das ist mir bei diesem Projekt nämlich häufiger untergekommen.
Re: mehrere leerzeichen durch ein leerzeichen ersetzen
Verfasst: Sonntag 1. Mai 2011, 18:28
von derdon
Schau dir meinen Code noch einmal an. s ist bei mir ein String, keine Liste. /me arbeitet direkt mit einer Liste. splitlines ist eine Methode der Klasse str, list hat solch eine Methode nicht. Du kannst meinen Code so anpassen, dass in der generator expression "… for line in data" steht.
Re: mehrere leerzeichen durch ein leerzeichen ersetzen
Verfasst: Sonntag 1. Mai 2011, 18:36
von Chibi
ah ok ja klar

, vielen dank an alle hier. Jetzt komme ich erstmal weiter