Entfernen Sie nachfolgende Zeilenumbrüche aus den Elementen einer Zeichenfolgenliste

122

Ich muss eine große Liste von Wörtern in der Form nehmen:

['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']

und dann mit der Strip-Funktion verwandeln Sie es in:

['this', 'is', 'a', 'list', 'of', 'words']

Ich dachte, dass das, was ich geschrieben hatte, funktionieren würde, aber ich bekomme immer wieder die Fehlermeldung:

"'list' Objekt hat kein Attribut 'strip'"

Hier ist der Code, den ich ausprobiert habe:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())
George Burrows
quelle
1
Bitte erläutern Sie, warum Sie 0 bis strip_list19 Mal anhängen und dann Ihre abisolierten Zeilen anhängen. Dieser Code hat einen sehr schlechten Geruch. Auch wenn Sie dieses Zeug aus einer Datei haben, sollten Sie es auf dem Weg zum Entfernen entfernen - eine große Liste erstellen und dann in eine andere große Liste einbinden ist keine gute Idee. Außerdem sollte Ihr Code nicht davon abhängen, die Länge des längsten Wortes / der längsten Zeile zu kennen. Treten Sie ein bisschen zurück - was versuchen Sie zu erreichen? Was wirst du damit machen strip_list?
John Machin

Antworten:

211
>>> my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> map(str.strip, my_list)
['this', 'is', 'a', 'list', 'of', 'words']
Sven Marnach
quelle
könnte ich dann einfach stripped_list = map (str.strip, my_list) sagen und dann stripped_list drucken, um diese neue Liste zu drucken?
George Burrows
19
Wenn Sie Python 2 verwenden, str.stripfunktioniert dies jedoch nur, wenn Sie sicher sind, dass die Liste keine Unicode-Zeichenfolgen enthält. Wenn es sowohl 8-Bit- als auch Unicode-Zeichenfolgen enthalten kann, verwenden Sie diese lambda s: s.strip()wie oben erwähnt oder verwenden Sie die stripFunktion, die Sie aus dem stringsModul importieren können .
Cito
Der Cito-Kommentar ist tatsächlich derjenige, der die meisten Wiederholungen verdient. Karten- und Verständnislisten sind in OOP nicht gleichwertig, da wir Passe-Methoden und keine Funktionen sind.
E-Satis
eingebaute Kartenfunktion im
Samariter
39
Beachten Sie Folgendes: Wenn Sie Python 3.x verwenden und eine Liste zurückgeben möchten, müssen Sie dies listtun list(map(str.strip, my_list)). Überprüfen Sie auch das: Link .
Also S
118

Listenverständnis? [x.strip() for x in lst]

Yosukesabai
quelle
64

Sie können Listenverständnisse verwenden :

strip_list = [item.strip() for item in lines]

Oder die mapFunktion:

# with a lambda
strip_list = map(lambda it: it.strip(), lines)

# without a lambda
strip_list = map(str.strip, lines)
Schnouki
quelle
3
Das Lambda in der zweiten Version ist übertrieben.
GDDC
1
Mit dem gleichen Ansatz können Sie auch mit den 0Werten am Anfang der Liste alles tun, was es ist . Obwohl ich mir nicht wirklich vorstellen kann, was Sie erreichen wollen, indem Sie sie in dieselbe Ergebnisliste aufnehmen ...
Karl Knechtel
4
In Python 3 sollte die dritte Form "ohne Lambda" lauten, strip_list = list(map(str.strip, lines))da map () einen Karteniterator zurückgibt. docs.python.org/3/library/functions.html#map
Devy
7

Dies kann unter Verwendung von Listenverständnissen erfolgen, wie in PEP 202 definiert

[w.strip() for w in  ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']]
Casey
quelle
Ich dachte daran, den Namen von listin map:) zu ändern
Casey
3

Alle anderen Antworten und hauptsächlich das Listenverständnis sind großartig. Aber nur um Ihren Fehler zu erklären:

strip_list = []
for lengths in range(1,20):
    strip_list.append(0) #longest word in the text file is 20 characters long
for a in lines:
    strip_list.append(lines[a].strip())

aist ein Mitglied Ihrer Liste, kein Index. Was Sie schreiben könnten, ist Folgendes:

[...]
for a in lines:
    strip_list.append(a.strip())

Ein weiterer wichtiger Kommentar: Sie können auf diese Weise eine leere Liste erstellen:

strip_list = [0] * 20

Dies ist jedoch nicht so nützlich, da .append Dinge an Ihre Liste angehängt werden . In Ihrem Fall ist es nicht sinnvoll, eine Liste mit Standardwerten zu erstellen, da Sie diese beim Anhängen von entfernten Zeichenfolgen Element für Element erstellen.

Ihr Code sollte also wie folgt aussehen:

strip_list = []
for a in lines:
    strip_list.append(a.strip())

Aber das Beste ist sicherlich dieses, da dies genau dasselbe ist:

stripped = [line.strip() for line in lines]

Wenn Sie etwas Komplizierteres als nur ein haben .strip, fügen Sie dies in eine Funktion ein und machen Sie dasselbe. Das ist die am besten lesbare Art, mit Listen zu arbeiten.

Joël
quelle
2

Wenn Sie nur nachgestellte Leerzeichen entfernen müssen , können Sie Folgendes verwenden: Dies str.rstrip()sollte etwas effizienter sein als str.strip():

>>> lst = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
>>> [x.rstrip() for x in lst]
['this', 'is', 'a', 'list', 'of', 'words']
>>> list(map(str.rstrip, lst))
['this', 'is', 'a', 'list', 'of', 'words']
Eugene Yarmash
quelle
-1
my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
print([l.strip() for l in my_list])

Ausgabe:

['this', 'is', 'a', 'list', 'of', 'words']
Vignesh Kini K.
quelle
wie andere ältere Antworten
Jean-François Fabre