Respuestas:
No modifique las cadenas.
Trabaja con ellos como listas; conviértalos en cadenas solo cuando sea necesario.
>>> s = list("Hello zorld")
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'z', 'o', 'r', 'l', 'd']
>>> s[6] = 'W'
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> "".join(s)
'Hello World'
Las cadenas de Python son inmutables (es decir, no se pueden modificar). Hay muchas razones para esto. Use listas hasta que no tenga otra opción, solo luego conviértalas en cadenas.
MID
debido a los cortes:s[:index] + c + s[index+1:]
Hay tres formas Para los buscadores de velocidad recomiendo el 'Método 2'
Método 1
Dada por esta respuesta
text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)
Lo cual es bastante lento en comparación con el 'Método 2'
timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027
Método 2 (MÉTODO RÁPIDO)
Dada por esta respuesta
text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]
Lo cual es mucho más rápido:
timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195
Método 3:
Conjunto de bytes:
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
1.0387420654296875
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
dos veces más lento que el más rápido.
new = text[:1] + 'Z' + text[2:]
Las cadenas de Python son inmutables, puede cambiarlas haciendo una copia.
La forma más fácil de hacer lo que quieres es probablemente:
text = "Z" + text[1:]
El text[1:]
devuelve la cadena text
desde la posición 1 hasta el final, las posiciones cuentan desde 0, por lo que '1' es el segundo carácter.
editar: puede usar la misma técnica de corte de cadena para cualquier parte de la cadena
text = text[:1] + "Z" + text[2:]
O si la letra solo aparece una vez, puede usar la técnica de búsqueda y reemplazo que se sugiere a continuación
Comenzando con python 2.6 y python 3, puede usar bytearrays que son mutables (se pueden cambiar por elementos a diferencia de las cadenas):
s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg
editar: Cambiado str a s
edit2: Como mencionó el alquimista de dos bits en los comentarios, este código no funciona con unicode.
bytearray(s)
, no bytearray(str)
. Por otra parte, esto producirá: TypeError: string argument without an encoding
. Si especificas una codificación, entonces obtienes TypeError: an integer is required
. Eso es con Python 3 o Python 2's unicode. Si hace esto en Python 2 (con una segunda línea corregida), no funcionará para los caracteres que no son ASCII porque pueden no ser solo un byte. Pruébalo s = 'Héllo'
y obtendrás 'He\xa9llo'
.
s = u'abcdefg'
.
Como han dicho otras personas, generalmente se supone que las cadenas de Python son inmutables.
Sin embargo, si está utilizando CPython, la implementación en python.org, es posible usar ctypes para modificar la estructura de la cadena en la memoria.
Aquí hay un ejemplo donde uso la técnica para borrar una cadena.
Marcar datos como sensibles en python
Menciono esto en aras de la integridad, y este debería ser su último recurso, ya que es hackish.
str
no es el tipo adecuado para usted. Simplemente no lo uses. Use algo como en su bytearray
lugar. (Mejor aún, envuélvalo en algo que le permita tratarlo más o menos como datos opacos para que realmente no pueda recuperar uno str
de él, para protegerlo de accidentes. Puede haber una biblioteca para eso. Ni idea).
Este código no es mío. No podía recordar el sitio donde lo tomé. Curiosamente, puede usar esto para reemplazar un personaje o más con uno o más personajes. Aunque esta respuesta es muy tardía, los principiantes como yo (en cualquier momento) pueden encontrarla útil.
mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
l
. mytext = mytext.replace('l', 'W')
->HeWWo Zorld
mytext = mytext.replace('l', 'W',1)
. Enlace al documento
En realidad, con cadenas, puedes hacer algo como esto:
oldStr = 'Hello World!'
newStr = ''
for i in oldStr:
if 'a' < i < 'z':
newStr += chr(ord(i)-32)
else:
newStr += i
print(newStr)
'HELLO WORLD!'
Básicamente, estoy "agregando" + "cadenas" juntas en una nueva cadena :).
si su mundo es 100% ascii/utf-8
(muchos casos de uso caben en ese cuadro):
b = bytearray(s, 'utf-8')
# process - e.g., lowercasing:
# b[0] = b[i+1] - 32
s = str(b, 'utf-8')
Python 3.7.3
Me gustaría agregar otra forma de cambiar un carácter en una cadena.
>>> text = '~~~~~~~~~~~'
>>> text = text[:1] + (text[1:].replace(text[0], '+', 1))
'~+~~~~~~~~~'
¿Qué tan rápido es en comparación con convertir la cadena en una lista y reemplazar el i-ésimo y luego unir nuevamente?
Enfoque de lista
>>> timeit.timeit("text = '~~~~~~~~~~~'; s = list(text); s[1] = '+'; ''.join(s)", number=1000000)
0.8268570480013295
Mi solución
>>> timeit.timeit("text = '~~~~~~~~~~~'; text=text[:1] + (text[1:].replace(text[0], '+', 1))", number=1000000)
0.588400217000526