¿Cuál es la forma más fácil en Python para reemplazar un carácter en una cadena?
Por ejemplo:
text = "abcdefg";
text[1] = "Z";
^
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:]
Método más rápido?
Hay tres formas Para los buscadores de velocidad recomiendo el 'Método 2'
Método 1
Dada por esta respuesta
Lo cual es bastante lento en comparación con el 'Método 2'
Método 2 (MÉTODO RÁPIDO)
Dada por esta respuesta
Lo cual es mucho más rápido:
Método 3:
Conjunto de bytes:
fuente
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.fuente
Las cadenas de Python son inmutables, puede cambiarlas haciendo una copia.
La forma más fácil de hacer lo que quieres es probablemente:
El
text[1:]
devuelve la cadenatext
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
O si la letra solo aparece una vez, puede usar la técnica de búsqueda y reemplazo que se sugiere a continuación
fuente
Comenzando con python 2.6 y python 3, puede usar bytearrays que son mutables (se pueden cambiar por elementos a diferencia de las cadenas):
editar: Cambiado str a s
edit2: Como mencionó el alquimista de dos bits en los comentarios, este código no funciona con unicode.
fuente
bytearray(s)
, nobytearray(str)
. Por otra parte, esto producirá:TypeError: string argument without an encoding
. Si especificas una codificación, entonces obtienesTypeError: 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ébalos = '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.
fuente
str
no es el tipo adecuado para usted. Simplemente no lo uses. Use algo como en subytearray
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 unostr
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.
Cambiar la función de texto.
fuente
l
.mytext = mytext.replace('l', 'W')
->HeWWo Zorld
mytext = mytext.replace('l', 'W',1)
. Enlace al documentoEn realidad, con cadenas, puedes hacer algo como esto:
Básicamente, estoy "agregando" + "cadenas" juntas en una nueva cadena :).
fuente
si su mundo es 100%
ascii/utf-8
(muchos casos de uso caben en ese cuadro):Python 3.7.3
fuente
Me gustaría agregar otra forma de cambiar un carácter en una cadena.
¿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
Mi solución
fuente