¿Cómo eliminar todas las instancias de un carácter en una cadena en python?

¿Cómo elimino todas las instancias de un carácter en esta cadena? Aquí está mi código:

def findreplace(char, string): place = string.index(char) string[place] = '' return string 

Sin embargo, si ejecuto esto, esto es lo que sucede:

 >>> findreplace('i', 'it is icy') Traceback (most recent call last): File "", line 1, in  File "", line 3, in findreplace TypeError: 'str' object does not support item assignment 

¿Por qué es esto?

Las cadenas son inmutables en Python, lo que significa que una vez que se crea una cadena, no puede alterar el contenido de las cadenas. Si es que necesita cambiarlo, se creará una nueva instancia de la cadena con las modificaciones.

Teniendo eso en cuenta, tenemos muchas maneras de resolver esto.

  1. Utilizando str.replace ,

     >>> "it is icy".replace("i", "") 'ts cy' 
  2. Utilizando str.translate ,

     >>> "it is icy".translate(None, "i") 'ts cy' 
  3. Usando la Expresión Regular,

     >>> import re >>> re.sub(r'i', "", "it is icy") 'ts cy' 
  4. Usando la comprensión como filtro,

     >>> "".join([char for char in "it is icy" if char != "i"]) 'ts cy' 
  5. Usando la función de filter

     >>> "".join(filter(lambda char: char != "i", "it is icy")) 'ts cy' 

Comparación de tiempos

 def findreplace(m_string, char): m_string = list(m_string) for k in m_string: if k == char: del(m_string[m_string.index(k)]) return "".join(m_string) def replace(m_string, char): return m_string.replace("i", "") def translate(m_string, char): return m_string.translate(None, "i") from timeit import timeit print timeit("findreplace('it is icy','i')", "from __main__ import findreplace") print timeit("replace('it is icy','i')", "from __main__ import replace") print timeit("translate('it is icy','i')", "from __main__ import translate") 

Resultado

 1.64474582672 0.29278588295 0.311302900314 

str.replace métodos str.replace y str.translate son 8 y 5 veces más rápidos que la respuesta aceptada.

Nota: Se espera que el método de comprensión y los métodos de filtro sean más lentos, en este caso , ya que tienen que crear una lista y luego deben recorrerse nuevamente para construir una cadena. Y re es un poco excesivo para un reemplazo de un solo personaje. Por lo tanto, todos están excluidos de la comparación de tiempos.

Prueba str.replace() :

 str="it is icy" print str.replace("i", "") 
 >>> x = 'it is icy'.replace('i', '', 1) >>> x 't is icy' 

Como su código solo reemplazaría a la primera instancia, asumí que eso es lo que quería. Si desea reemplazarlos a todos, deje de lado el argumento 1 .

Como no puede reemplazar el carácter en la cadena, debe volver a asignarlo a la variable. (Esencialmente, debes actualizar la referencia en lugar de modificar la cadena).

replace() método replace() funcionará para esto. Aquí está el código que ayudará a eliminar el carácter de la cadena. digamos

 j_word = 'Stringtoremove' word = 'String' for letter in word: if j_word.find(letter) == -1: continue else: # remove matched character j_word = j_word.replace(letter, '', 1) #Output j_word = "toremove" 

Sugiero dividir (sin decir que las otras respuestas no son válidas, esta es solo otra forma de hacerlo):

 def findreplace(char, string): return ''.join(string.split(char)) 

La división por un carácter elimina todos los caracteres y los convierte en una lista. Luego nos unimos a la lista con la función de unión. Puedes ver la prueba de la consola ipython abajo

 In[112]: findreplace('i', 'it is icy') Out[112]: 'ts cy' 

Y la velocidad …

 In[114]: timeit("findreplace('it is icy','i')", "from __main__ import findreplace") Out[114]: 0.9927914671134204 

No tan rápido como reemplazar o traducir, pero está bien.

 # s1 == source string # char == find this character # repl == replace with this character def findreplace(s1, char, repl): s1 = s1.replace(char, repl) return s1 # find each 'i' in the string and replace with a 'u' print findreplace('it is icy', 'i', 'u') # output ''' ut us ucy '''