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