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.