2011-11-02 12 views
68

devo prendere un ampio elenco di parole nella forma:Strip tutti gli elementi di un elenco di stringhe

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

e quindi utilizzando la funzione strip, lo trasformano in:

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

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

"'list' object has no attribute '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

Si prega di spiegare perché si sta aggiungendo 0 a 'strip_list' 19 volte, quindi aggiungendo le linee spogliate. Quel codice ha un cattivo odore a riguardo. Inoltre, se hai preso quella roba da un file, dovresti spogliarla mentre stai facendo - costruire una lista di grandi dimensioni e poi scagliarla in un'altra grande lista non è una buona idea. Inoltre, il tuo codice non dovrebbe dipendere dal conoscere la lunghezza della parola/riga più lunga. Fai un passo indietro - cosa stai cercando di ottenere? Cosa farai con 'strip_list'? –

+0

Correlati [Come rimuovere \ n da un elemento dell'elenco?] (Http: // stackoverflow.com/q/3849509) –

risposta

128
>>> 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'] 
+0

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

+0

@GeorgeBurrows Sì. – agf

+16

Se stai usando Python 2, nota comunque che 'str.strip' funziona solo se sei sicuro che l'elenco non contenga stringhe unicode. Se può contenere sia stringhe 8-bit che unicode, usa 'lambda s: s.strip()' come menzionato sopra, o usa la funzione 'strip' che puoi importare dal modulo' stringhe'. – Cito

31

È possibile utilizzare lists comprehensions:

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

o la funzione map:

# 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. –

+1

È possibile utilizzare lo stesso approccio per fare qualsiasi cosa con i valori '0' all'inizio della lista, anche. Anche se non riesco davvero a immaginare cosa stia cercando di ottenere inserendoli nella stessa lista dei risultati ... –

+1

In Python 3, la terza forma "without a lambda" dovrebbe essere 'strip_list = list (map (str .strip, lines)) 'as map() restituisce un iteratore di mappe. https://docs.python.org/3/library/functions.html#map – Devy

7

Questo può essere fatto utilizzando list comprehensions come definito nella PEP 202

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

Stavo pensando di cambiare il nome da 'list' a' map' :) – Casey

2

Tutti gli altri risposte, a e principalmente sulla comprensione delle liste, sono grandiosi. Ma proprio per spiegare l'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 della vostra lista, non è un indice. Che cosa si potrebbe scrivere è questo:

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

Un altro commento importante: è possibile creare una lista vuota in questo modo:

strip_list = [0] * 20 

ma questo non è così utile, come .appendaccoda roba alla tua lista . Nel tuo caso, non è utile creare un elenco con valori di default, poiché lo si costruisce per articolo quando si aggiungono stringhe spogliate.

Così il vostro codice dovrebbe essere simile:

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

Ma, di sicuro, il migliore è questo, in quanto questo è esattamente la stessa cosa:

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

Nel caso in cui si ha qualcosa più complicato di un semplice .strip, metterlo in una funzione e fare lo stesso. Questo è il modo più leggibile per lavorare con le liste.

Problemi correlati