Rimuove la nuova riga finale dagli elementi di un elenco di stringhe


123

Devo prendere un lungo elenco di parole nella forma:

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

e quindi utilizzando la funzione strip, trasformalo in:

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

Pensavo che quello che avevo scritto avrebbe funzionato, ma continuo a ricevere un errore che dice:

"L'oggetto 'list' non ha l'attributo 'strip'"

Ecco il codice che ho provato:

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())

1
Spiega perché stai aggiungendo da 0 a strip_list19 volte e poi aggiungendo le righe eliminate. Quel codice ha un cattivo odore. Inoltre, se hai preso quella roba da un file, dovresti rimuoverla mentre entri - costruire una lista grande e poi inserirla in un'altra lista grande non è una buona idea. Inoltre 2, il tuo codice non dovrebbe dipendere dalla conoscenza della lunghezza della parola / riga più lunga. Fai un passo indietro: cosa stai cercando di ottenere? Cosa farai con strip_list?
John Machin

Risposte:


212
>>> 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']

potrei quindi semplicemente dire stripped_list = map (str.strip, my_list) e quindi stampare stripped_list per stampare questo nuovo elenco?
George Burrows

19
Se stai usando Python 2, tieni presente che str.stripfunziona solo se sei sicuro che l'elenco non contenga stringhe Unicode. Se può contenere stringhe sia a 8 bit che unicode, usa lambda s: s.strip()come menzionato sopra, o usa la stripfunzione che puoi importare dal stringsmodulo.
Cito

Il commento di Cito è in realtà quello che merita più ripetizioni. gli elenchi di mappe e di comprensione non sono equivalenti in OOP, perché siamo metodi passivi, non funzioni.
e-satis

funzione mappa integrata nel samaritano
SIslam,

39
Tieni presente quanto segue: se stai usando Python 3.x e vuoi restituire un elenco, devi farlo list, in modo che sia list(map(str.strip, my_list)). Controlla anche quello: link .
Quindi S


65

Puoi usare le comprensioni degli elenchi :

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

O la mapfunzione:

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

# without a lambda
strip_list = map(str.strip, lines)

3
Il lambda nella seconda versione è eccessivo.
gddc

1
Puoi usare lo stesso approccio anche per fare qualunque cosa con i 0valori all'inizio dell'elenco. Anche se non riesco davvero a immaginare cosa stai cercando di ottenere inserendoli nella stessa lista dei risultati ...
Karl Knechtel

4
In Python 3, la terza forma "senza lambda" dovrebbe essere strip_list = list(map(str.strip, lines))come map () restituisce un iteratore di mappa. docs.python.org/3/library/functions.html#map
Devy,

7

Questo può essere fatto utilizzando le list list come definite in PEP 202

[w.strip() for w in  ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']]

Stavo pensando di cambiare il nome da lista map:)
Casey

3

Tutte le altre risposte, e principalmente sulla comprensione delle liste, sono ottime. Ma solo per spiegare il tuo errore:

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())

aè un membro del tuo elenco, non un indice. Quello che potresti scrivere è questo:

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

Un altro commento importante: puoi creare un elenco vuoto in questo modo:

strip_list = [0] * 20

Ma questo non è così utile, come .append aggiunge alla tua lista. Nel tuo caso, non è utile creare un elenco con valori predefiniti, poiché lo creerai elemento per elemento quando aggiungi stringhe rimosse.

Quindi il tuo codice dovrebbe essere come:

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

Ma, di sicuro, il migliore è questo, poiché è esattamente la stessa cosa:

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

Nel caso tu abbia qualcosa di più complicato di un semplice .strip, mettilo in una funzione e fai lo stesso. Questo è il modo più leggibile per lavorare con gli elenchi.


2

Se è necessario rimuovere solo gli spazi vuoti finali , è possibile utilizzare str.rstrip(), che dovrebbe essere leggermente più efficiente di 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']

-1
my_list = ['this\n', 'is\n', 'a\n', 'list\n', 'of\n', 'words\n']
print([l.strip() for l in my_list])

Produzione:

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

come altre risposte precedenti
Jean-François Fabre
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.