如何在Python中删除字符串中所有字符的实例?

92 投票
6 回答
172049 浏览
提问于 2025-04-17 20:52

我该怎么做才能删除这个字符串中所有的某个字符呢?这是我的代码:

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

这是为什么呢?

6 个回答

1

我建议使用分割的方法(不是说其他的答案不对,这只是另一种做法):

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

虽然没有替换或翻译那么快,但也还可以。

3

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"
3
>>> x = 'it is icy'.replace('i', '', 1)
>>> x
't is icy'

因为你的代码只会替换第一个出现的地方,所以我猜这就是你想要的。如果你想替换所有的地方,就把1这个参数去掉。

由于你不能直接在字符串中替换字符,所以你需要把新的字符串重新赋值给变量。也就是说,你需要更新这个变量的内容,而不是直接修改字符串本身。

13

试试用 str.replace() 这个方法:

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

在Python中,字符串是不可变的,这意味着一旦创建了一个字符串,你就不能改变它的内容。如果你想要修改它,就需要创建一个新的字符串实例,里面包含你想要的更改。

考虑到这一点,我们有很多方法可以解决这个问题:

  1. 使用 str.replace 方法,

    >>> "it is icy".replace("i", "")
    't s cy'
    
  2. 使用 str.translate 方法,

    >>> "it is icy".translate(None, "i")
    't s cy'
    
  3. 使用正则表达式,

    >>> import re
    >>> re.sub(r'i', "", "it is icy")
    't s cy'
    
  4. 使用列表推导作为过滤器,

    >>> "".join([char for char in "it is icy" if char != "i"])
    't s cy'
    
  5. 使用 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.replacestr.translate 方法的速度分别是被接受答案的8倍和5倍。

注意: 在这个情况下,列表推导和过滤方法预计会更慢,因为它们需要先创建一个列表,然后再遍历这个列表来构建字符串。而且对于单个字符的替换,使用 re 模块有点过于复杂。因此,它们都被排除在时间比较之外。

撰写回答