2010-07-12 16 views
27

Ho un elenco di oggetti aggiunti da un database mysql e contengono spazi. Desidero rimuovere gli spazi come di seguito, ma il codice che sto usando non funziona?Python: rimozione degli spazi dagli oggetti lista

hello = ['999 ',' 666 '] 

k = [] 

for i in hello: 
    str(i).replace(' ','') 
    k.append(i) 

print k 
+2

o fissare il tipo di campo del database ;-) – ChristopheD

+0

@ChristopheD: Quali dati "sul campo" le forze di tipo ** ** leader spazi? Meglio aggiustare lo sviluppatore e il tester. –

+1

@Johan Machin: ho sbagliato lo spazio iniziale sulla seconda voce (giudicato un po 'troppo veloce, oops) – ChristopheD

risposta

63

stringhe in Python sono immutabili (nel senso che i dati non possono essere modificati) così la sostituzione metodo non modifica la stringa - restituisce una nuova stringa. Puoi correggere il tuo codice come segue:

for i in hello: 
    j = i.replace(' ','') 
    k.append(j) 

Tuttavia un modo migliore per raggiungere il tuo obiettivo è utilizzare una comprensione di lista. Ad esempio, il seguente codice rimuove spazi iniziali e finali da ogni stringa nella lista utilizzando strip:

hello = [x.strip(' ') for x in hello] 
+7

+1 per striscia. -1 per la sostituzione ('', '') –

+1

OP desidera rimuovere * tutti * gli spazi, non solo i rimorchi, quindi perché -1 per 'replace ('', '')'? Nessuno dei metodi 'strip', tanto meno gli altri [built-in str metodi] (http://docs.python.org/library/stdtypes.html#string-methods), fanno il lavoro (ignorando Rube Goldbergs come ' '' .join (s.split()) '). –

+0

Ah, quindi non è un campo di testo che utilizzava spazi per separare migliaia, milioni, ecc. Che è definito come testo perché potrebbe contenere la parola chiave occasionale? OK, mi sono perso. –

5

risultato = map (lambda x: x.strip(), ciao)

+3

Non è necessario usare il 'lambda'; invece potresti usare: 'result = map (str.strip(), hello)'. Tuttavia, come menzionato da @riza, in Python 3 map restituisce un iteratore invece di una lista. Quindi la migliore pratica sarebbe 'result = list (map (str.strip(), hello))'. – amicitas

+1

Nota che (in Python 3 almeno) devi dire 'map (str.strip, mylist)' non 'map (str.strip(), mylist)'. – William

2

metodi stringa restituita la stringa modificata.

k = [x.replace(' ', '') for x in hello] 
0

replace() non funziona sul posto, è necessario assegnare il suo risultato a qualcosa. Inoltre, per una sintassi più concisa, si potrebbe soppiantare il vostro ciclo for con una battuta: hello_no_spaces = map(lambda x: x.replace(' ', ''), hello)

1

Presumendo che non si desidera rimuovere gli spazi interni:

def normalize_space(s): 
    """Return s stripped of leading/trailing whitespace 
    and with internal runs of whitespace replaced by a single SPACE""" 
    # This should be a str method :-(
    return ' '.join(s.split()) 

replacement = [normalize_space(i) for i in hello] 
6

di lista [num.strip() for num in hello] è il più veloce .

>>> import timeit 
>>> hello = ['999 ',' 666 '] 

>>> t1 = lambda: map(str.strip, hello) 
>>> timeit.timeit(t1) 
1.825870468015296 

>>> t2 = lambda: list(map(str.strip, hello)) 
>>> timeit.timeit(t2) 
2.2825958750515269 

>>> t3 = lambda: [num.strip() for num in hello] 
>>> timeit.timeit(t3) 
1.4320335103944899 

>>> t4 = lambda: [num.replace(' ', '') for num in hello] 
>>> timeit.timeit(t4) 
1.7670568718943969 
+0

'list (map (str.strip, hello))' non ha molto senso poiché 'map' restituisce una lista stessa. – ChristopheD

+1

@ChristopheD: In Python 3, la mappa non restituisce una lista. – riza

0
for element in range(0,len(hello)): 
     d[element] = hello[element].strip() 
+2

Oltre al tuo codice, spiega perché la tua risposta funziona e come risolve il problema. – buczek

Problemi correlati