How to delete all instances of a character in a string in python?

PythonStringPython 2.7Replace

Python Problem Overview


How do I delete all the instances of a character in this string? Here is my code:

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

However, if I run this, this is what happens:

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

Why is this?

Python Solutions


Solution 1 - Python

Strings are immutable in Python, which means once a string is created, you cannot alter the contents of the strings. If at all, you need to change it, a new instance of the string will be created with the alterations.

Having that in mind, we have so many ways to solve this

  1. Using str.replace,

     >>> "it is icy".replace("i", "")
     't s cy'
    
  2. Using str.translate,

     >>> "it is icy".translate(None, "i")
     't s cy'
    
  3. Using Regular Expression,

     >>> import re
     >>> re.sub(r'i', "", "it is icy")
     't s cy'
    
  4. Using comprehension as a filter,

     >>> "".join([char for char in "it is icy" if char != "i"])
     't s cy'
    
  5. Using filter function

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

Timing comparison

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")

Result

1.64474582672
0.29278588295
0.311302900314

str.replace and str.translate methods are 8 and 5 times faster than the accepted answer.

Note: Comprehension method and filter methods are expected to be slower, for this case, since they have to create list and then they have to be traversed again to construct a string. And re is a bit overkill for a single character replacement. So, they all are excluded from the timing comparison.

Solution 2 - Python

Try str.replace():

my_string = "it is icy"
print my_string.replace("i", "")

Solution 3 - Python

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

Since your code would only replace the first instance, I assumed that's what you wanted. If you want to replace them all, leave off the 1 argument.

Since you cannot replace the character in the string itself, you have to reassign it back to the variable. (Essentially, you have to update the reference instead of modifying the string.)

Solution 4 - Python

replace() method will work for this. Here is the code that will help to remove character from string. lets say

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"

Solution 5 - Python

I suggest split (not saying that the other answers are invalid, this is just another way to do it):

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

Splitting by a character removes all the characters and turns it into a list. Then we join the list with the join function. You can see the ipython console test below

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

And the speed...

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

Not as fast as replace or translate, but ok.

Solution 6 - Python

# 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 '''

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser3367523View Question on Stackoverflow
Solution 1 - PythonthefourtheyeView Answer on Stackoverflow
Solution 2 - PythonBlue IceView Answer on Stackoverflow
Solution 3 - Pythonjpmc26View Answer on Stackoverflow
Solution 4 - PythonMaNKuRView Answer on Stackoverflow
Solution 5 - Pythonwhackamadoodle3000View Answer on Stackoverflow
Solution 6 - PythonMichael SwartzView Answer on Stackoverflow