2012-02-26 11 views

Respuesta

24

cadenas son inmutables. Eso significa que no puedes asignarles nada. Se podría utilizar 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 hay que tener en cuenta que todos estos métodos crean copia de la cadena, en lugar de modificarla in situ. Si desea una modificación in situ, puede usar un bytearray, aunque eso solo funcionará para cadenas de caracteres simples, como señala alexis.

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

O podría crear una lista de caracteres y manipular eso. Esta es probablemente la forma más eficiente y correcta de hacerlo con frecuencia, a gran escala de manipulación de cadenas:

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

Y considere el módulo re para las operaciones más complejas.

El formato de cadenas y la manipulación de listas son los dos métodos que tienen más probabilidades de ser correctos y eficientes cuando se requieren pocas inserciones, y enumeran la manipulación cuando necesita actualizar frecuentemente su cadena.

+1

También los métodos str.replace() y re.RegexObject.sub podrían ser útiles. – Odomontois

+0

bytearray se ve bien para mí, ¿hay alguna manera de convertir cadena a matriz de bytes? – w00d

+0

@iKid, en el código anterior, ''abc0efg'' es una cadena, y' bytearray (' abc0efg ') 'convierte esa cadena en bytearray. Entonces sí :) – senderle

5

Dado que las cadenas son "inmutables", obtiene el efecto de editar construyendo una versión modificada de la cadena y asignándola sobre el valor anterior. Si desea sustituir o insertar a una posición específica en la cadena, la sintaxis más variedad similar es utilizar rebanadas:

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

Es más probable que desea reemplazar un carácter particular o cadena con otra. Hacer eso con re, otra vez poniendo el resultado en lugar de modificar en su lugar:

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

Como python n00b, esto era exactamente lo que quería cambiar un personaje en una posición particular. Gracias. –

0

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

se puede usar así

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

esto es muy simple que otras formas complejas

Cuestiones relacionadas