mehrere leerzeichen durch ein leerzeichen ersetzen

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
Chibi
User
Beiträge: 22
Registriert: Samstag 7. November 2009, 12:10

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
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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
Chibi
User
Beiträge: 22
Registriert: Samstag 7. November 2009, 12:10

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..
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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']
In specifications, Murphy's Law supersedes Ohm's.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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
Chibi
User
Beiträge: 22
Registriert: Samstag 7. November 2009, 12:10

/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.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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.
Chibi
User
Beiträge: 22
Registriert: Samstag 7. November 2009, 12:10

ah ok ja klar :oops: , vielen dank an alle hier. Jetzt komme ich erstmal weiter
Antworten