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

Code: Alles auswählen

for i in len(data):
    print data[i]
für Python äußerst umständlicher Code. Idiomatisch wäre

Code: Alles auswählen

for entry in data:
    print entry

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 :oops: , vielen dank an alle hier. Jetzt komme ich erstmal weiter