Alternativa a la asignación de elementos de la cadena Python

¿Cuál es la mejor / forma correcta de usar la asignación de elementos para la cadena de python?

es decir, s = "ABCDEFGH" s[1] = 'a' s[-1]='b' ?

La forma normal lanzará: 'str' object does not support item assignment

Las cuerdas son inmutables. Eso significa que no puedes asignarles nada. Podrías usar el formato:

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

O concatenación:

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

O reemplazo (gracias Odomontois por recordármelo):

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

Pero tenga en cuenta que todos estos métodos crean copias de la cadena, en lugar de modificarla en el lugar. Si desea una modificación en el lugar, puede usar un bytearray , aunque eso solo funcionará para cadenas ascii simples, como señala alexis.

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

O puedes crear una lista de personajes y manipular eso. Esta es probablemente la forma más eficiente y correcta de realizar una manipulación frecuente de cadenas a gran escala:

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

Y considérese el módulo de re para operaciones más complejas.

El formateo de cadenas y la manipulación de listas son los dos métodos que tienen más probabilidades de ser correctos y eficientes. Formateo de cadenas cuando solo se requieren algunas inserciones, y manipulación de listas cuando necesita actualizar su cadena con frecuencia.

Dado que las cadenas son “inmutables”, se obtiene el efecto de la edición al construir una versión modificada de la cadena y asignarla sobre el valor anterior. Si desea reemplazar o insertar una posición específica en la cadena, la syntax más parecida a una matriz es usar cortes:

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

Es más probable que desee reemplazar un carácter o cadena en particular con otro. Haga eso con re , nuevamente recolectando el resultado en lugar de modificarlo en su lugar:

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

Supongo que este Objeto podría ayudar:

 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) 

Por ejemplo:

 >>> 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'] 
 s = "ABCDEFGH" s[1] = 'a' s[-1]='b' 

puedes usar asi

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

Esto es muy simple que otras formas complejas.