¿Cambiar un carácter en una cadena?

¿Cuál es la forma más fácil en Python para reemplazar un carácter en una cadena como:

text = "abcdefg"; text[1] = "Z"; ^ 

No modifique las cadenas.

Trabaja con ellos como listas; conviértelos en cuerdas 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 pueden modificarse). Hay muchas razones para esto. Use las listas hasta que no tenga otra opción, solo entonces conviértalas en cadenas.

¿El método más rápido?

Hay tres maneras. Para los buscadores de velocidad recomiendo ‘Método 2’

Método 1

Dada por esta respuesta

 text = 'abcdefg' new = list(text) new[6] = 'W' ''.join(new) 

Que 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:] 

Que es mucho más rápido:

 timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000) 0.34651994705200195 

Método 3:

Matriz de bytes:

 timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000) 1.0387420654296875 
 new = text[:1] + 'Z' + text[2:] 

Las cuerdas de Python son inmutables, puedes cambiarlas haciendo una copia.
La forma más fácil de hacer lo que quieres es probablemente.

 text = "Z" + text[1:] 

El texto [1:] devuelve la cadena en el texto desde la posición 1 hasta el final, las posiciones cuentan desde 0, por lo que ‘1’ es el segundo carácter.

Edición: puede utilizar 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 utilizar la técnica de búsqueda y reemplazo que se sugiere a continuación.

Comenzando con python 2.6 y python 3, puede usar los bytearrays que son mutables (se pueden cambiar a modo de elemento a diferencia de las cadenas):

 s = "abcdefg" b_s = bytearray(s) b_s[1] = "Z" s = str(b_s) print s aZcdefg 

edición: se modificó de una a la otra

edit2: Como mencionó el Alquimista de dos bits en los comentarios, este código no funciona con Unicode.

Como han dicho otras personas, en general se supone que las cuerdas 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 cadena en la memoria.

Aquí hay un ejemplo donde uso la técnica para borrar una cadena.

Marca los datos como sensibles en Python

Menciono esto en aras de la exhaustividad, y este debería ser su último recurso, ya que es un truco.

En realidad, con cuerdas, 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" en una nueva cadena :).

Este código no es mío. No podía recordar la forma del sitio donde, lo tomé. Curiosamente, puede usar esto para reemplazar un carácter o más con uno o más caracteres. Aunque esta respuesta es muy tarde, los principiantes como yo (en cualquier momento) pueden encontrarla útil.

Cambiar la función de texto.

 mytext = 'Hello Zorld' mytext = mytext.replace('Z', 'W') print mytext, 

Una forma muy simple es hacer esto:

 word = "Heloo World!" word = word.replace(word[3], "l", 1) print word 

Salida:

  Hello World!