2012-02-26 10 views

risposta

24

stringhe sono immutabili. Ciò significa che non puoi assegnarli affatto. È possibile utilizzare la formattazione:

>>> s = 'abc{0}efg'.format('d') 
>>> s 
'abcdefg' 

O concatenazione:

>>> s = 'abc' + 'd' + 'efg' 
>>> s 
'abcdefg' 

o la sostituzione (grazie Odomontois per avermelo ricordato):

>>> s = 'abc0efg' 
>>> s.replace('0', 'd') 
'abcdefg' 

Ma tenere a mente che tutti questi metodi creano copia della stringa, anziché modificarla sul posto. Se si desidera la modifica sul posto, è possibile utilizzare uno bytearray, sebbene ciò funzioni solo per le stringhe ascii semplici, come indicato da Alexis.

>>> b = bytearray('abc0efg') 
>>> b[3] = 'd' 
>>> b 
bytearray(b'abcdefg') 

Oppure è possibile creare un elenco di caratteri e manipolarlo. Questo è probabilmente il modo più efficiente e corretta da fare frequenti, su larga scala la manipolazione di stringhe:

>>> l = list('abc0efg') 
>>> l[3] = 'd' 
>>> l 
['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> ''.join(l) 
'abcdefg' 

E considerare il modulo re per le operazioni più complesse.

La formattazione delle stringhe e la manipolazione delle liste sono i due metodi che sono più probabili essere corretti ed efficienti IMO - la formattazione delle stringhe quando sono richiesti solo alcuni inserimenti e la manipolazione degli elenchi quando è necessario aggiornare frequentemente la stringa.

+1

Anche i metodi str.replace() e re.RegexObject.sub potrebbero essere utili. – Odomontois

+0

bytearray mi sta bene, c'è comunque la conversione da stringa a matrice di byte? – w00d

+0

@iKid, nel codice precedente, ''abc0efg'' è una stringa, e' bytearray (' abc0efg ') 'converte quella stringa in un pertearray. Quindi sì :) – senderle

5

Poiché le stringhe sono "immutabili", si ottiene l'effetto di modifica costruendo una versione modificata della stringa e assegnandola al vecchio valore. Se si desidera sostituire o inserire una posizione specifica nella stringa, la sintassi più array come è quello di utilizzare le fette:

s = "ABCDEFGH" 
s = s[:3] + 'd' + s[4:] # Change D to d at position 3 

E 'più probabile che si desidera sostituire un carattere particolare o una stringa con un'altra. Farlo con re, ancora una volta raccogliendo il risultato, piuttosto che modificare in atto:

import re 
s = "ABCDEFGH" 
s = re.sub("DE", "--", s) 
+0

Come python n00b, questo era esattamente quello che volevo cambiare un personaggio in una posizione particolare. Grazie. –

0

Credo che questo oggetto potrebbe aiutare:

class Charray(list): 

    def __init__(self, mapping=[]): 
     "A character array." 
     if type(mapping) in [int, float, long]: 
      mapping = str(mapping) 
     list.__init__(self, mapping) 

    def __getslice__(self,i,j): 
     return Charray(list.__getslice__(self,i,j)) 

    def __setitem__(self,i,x): 
     if type(x) <> str or len(x) > 1: 
      raise TypeError 
     else: 
      list.__setitem__(self,i,x) 

    def __repr__(self): 
     return "charray['%s']" % self 

    def __str__(self): 
     return "".join(self) 

Ad esempio:

>>> carray = Charray("Stack Overflow") 
>>> carray 
charray['Stack Overflow'] 
>>> carray[:5] 
charray['Stack'] 
>>> carray[-8:] 
charray['Overflow'] 
>>> str(carray) 
'Stack Overflow' 
>>> carray[6] = 'z' 
>>> carray 
charray['Stack zverflow'] 
0
s = "ABCDEFGH" s[1] = 'a' s[-1]='b' 

voi può usare così

s=s[0:1]+'a'+s[2:] 

questo è molto semplice rispetto ad altri modi complessi

Problemi correlati