2010-06-22 15 views
9

Come rimuovere un carattere da un elemento in un elenco?Modifica di elementi in un elenco in python

Esempio:

mylist = ['12:01', '12:02'] 

Voglio rimuovere il colon dalle marche temporali in un file, in modo da poter più facilmente convertirli in un tempo di 24 ore. In questo momento sto cercando di scorrere gli elementi nella lista e cercare quello che contiene due punti e fare un sostituto.

for num in mylist: 
    re.sub(':', '', num) 

Ma non sembra funzionare.

Help!

+3

Non funziona perché le stringhe sono immutabili. 're.sub' in realtà ** restituisce ** una stringa ma non la stai assegnando. Leggere la documentazione: http://docs.python.org/library/re.html#re.sub –

risposta

13

La soluzione di lista è la più Pythonic, ma, c'è un tocco importante:

mylist[:] = [s.replace(':', '') for s in mylist] 

se si assegna a mylist, il barename, come nel altra risposta, piuttosto che mylist[:] , la "lista intera", come ti raccomando, stai facendo davvero qualcosa di molto diverso da "sostituire le voci nella lista": stai facendo una nuova lista e stai solo riconciliando il barename che stavi usando in precedenza fare riferimento alla vecchia lista.

Se a quella vecchia lista si fa riferimento con più nomi (incluse le voci nei contenitori), questa rebinding non influisce su nessuno di questi: ad esempio, se si ha una funzione che prende come argomento mylist, l'assegnazione del nome del bar ha qualche effetto solo localmente sulla funzione e non altera ciò che il chiamante vede come contenuto della lista.

Assegnazione alla fetta intera lista, mylist[:] = ..., altera l'oggetto elenco invece di gingillarsi con attacchi barenames commutazione - ora che la lista è veramente alterata e, non importa come è indicato, il nuovo valore viene cosa si vede Ad esempio, se si dispone di una funzione che accetta come argomento mylist, l'assegnazione dell'intera lista altera ciò che il chiamante vede come contenuto della lista.

La cosa fondamentale è sapere esattamente quale effetto si sta cercando - più comunemente si vorrà modificare l'oggetto lista, quindi, se si deve indovinare, l'assegnazione di slice a lista intera è solitamente l'ipotesi migliore da prendere ;-). Per quanto riguarda le prestazioni, non fa alcuna differenza in alcun modo (eccetto il fatto che l'assegnazione del nome del bar, se mantiene sia vecchi che nuovi oggetti in lista, occuperà più memoria per qualsiasi intervallo di tempo in cui entrambi gli oggetti sono ancora in circolazione, ovviamente).

4
for i, num in enumerate(mylist): 
    mylist[i] = num.replace(':','') 
+1

Per impostazione predefinita, sceglierei questa soluzione perché si annidano le nuove stringhe nello stesso oggetto elenco. L'approccio di comprensione degli elenchi separa il risultato dal puntatore dell'elenco originale. Quando l'elenco è di proprietà di un oggetto complesso e si desidera che l'oggetto complesso abbia l'elenco aggiornato, sarà necessario assegnare nuovamente la nuova lista a una proprietà, che è molto non-pythonic. – ddotsenko

15

Utilizzare un list comprehension per generare una nuova lista:

>>> mylist = ['12:01', '12:02'] 
>>> mylist = [s.replace(':', '') for s in mylist] 
>>> print mylist 
['1201', '1202'] 

La ragione per cui la soluzione non funziona è che re.sub restituisce un nuovi stringa - stringhe sono immutabili in Python, così re.sub non può modificare le stringhe esistenti.

+0

Comprensione delle liste in soccorso! – jathanism

+0

Esiste un vantaggio delle comprensioni delle liste sullo standard per i loop, o solo sulla leggibilità o sulla lunghezza del codice? – TooAngel

+3

@TooAngel: È più impressionante;) –

0

È necessario inserire nuovamente il ritorno di re.sub nell'elenco. Di seguito è riportato un nuovo elenco. Ma puoi farlo anche per la mia lista.

mylist = ['12:01', '12:02'] 
tolist = [] 
for num in mylist: 
    a = re.sub(':', '', num) 
    tolist.append(a) 

print tolist 
0

Le stringhe in python sono immutabili, il che significa che nessuna funzione può modificare il contenuto di una stringa esistente, fornire solo una nuova stringa. Ecco why.

Vedere here per una discussione sui tipi di stringa che possono essere modificati. In pratica, tuttavia, è meglio adattarsi all'immutabilità delle stringhe.

Problemi correlati