Подтвердить что ты не робот

Как удалить все экземпляры символа в строке в python?

Как удалить все экземпляры символа в этой строке? Вот мой код:

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

Однако, если я запустил это, это произойдет:

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

Почему это?

4b9b3361

Ответ 1

Строки неизменяемы в Python, что означает, что после создания строки вы не можете изменять содержимое строк. Если вообще, вам нужно изменить его, новый экземпляр строки будет создан с изменениями.

Имея это в виду, у нас есть так много способов решить эту проблему.

  • Используя str.replace,

    >>> "it is icy".replace("i", "")
    't s cy'
    
  • Используя str.translate,

    >>> "it is icy".translate(None, "i")
    't s cy'
    
  • Использование регулярного выражения

    >>> import re
    >>> re.sub(r'i', "", "it is icy")
    't s cy'
    
  • Используя понимание как фильтр,

    >>> "".join([char for char in "it is icy" if char != "i"])
    't s cy'
    
  • Используя filter функцию

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

Сравнение времени

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

Результат

1.64474582672
0.29278588295
0.311302900314

str.replace и str.translate методы в 8 и 5 раз быстрее, чем принятый ответ.

Примечание.. Метод понимания и методы фильтрации, как ожидается, будут медленнее для этого случая, так как они должны создать список, а затем их нужно пройти снова, чтобы построить строку. И re немного переборщик для замены одного символа. Таким образом, все они исключены из сравнения времени.

Ответ 2

Попробуйте str.replace():

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

Ответ 3

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

Поскольку ваш код заменит только первый экземпляр, я предположил, что вы хотите. Если вы хотите их заменить, оставьте аргумент 1.

Поскольку вы не можете заменить символ в самой строке, вы должны переназначить его обратно в переменную. (По сути, вам нужно обновить ссылку вместо изменения строки.)

Ответ 4

replace() будет работать для этого. Вот код, который поможет удалить символ из строки. скажем

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"

Ответ 5

Я предлагаю split (не говоря, что другие ответы недействительны, это просто еще один способ сделать это):

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

Разбиение символом удаляет все символы и превращает их в список. Затем мы присоединяемся к списку с функцией объединения. Вы можете увидеть тест консоли ipython ниже

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

И скорость...

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

Не так быстро, как заменить или перевести, но нормально.