【问题标题】:How to delete all instances of a character in a string in python?如何在python中删除字符串中字符的所有实例?
【发布时间】:2014-04-06 21:21:36
【问题描述】:

如何删除该字符串中某个字符的所有实例?这是我的代码:

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

这是为什么?

【问题讨论】:

    标签: python string python-2.7 replace


    【解决方案1】:

    试试str.replace():

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

    【讨论】:

    • 你不应该使用str作为变量
    【解决方案2】:
    # 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 '''
    

    【讨论】:

      【解决方案3】:

      我建议拆分(不是说其他​​答案无效,这只是另一种方法):

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

      按字符拆分会删除所有字符并将其变成一个列表。然后我们用 join 函数加入列表。可以看到下面的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
      

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

      【讨论】:

        【解决方案4】:

        字符串在 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 对于单个字符替换来说有点矫枉过正。因此,它们都被排除在时间比较之外。

        【讨论】:

        • .translate(maketrans('','')) 会和 .translate(None) 一样吗?
        • 可以说,正则表达式对于更复杂的示例可能会表现得更好,并且会很高兴看到。但是,很好的答案!
        • “比接受的答案快 8 倍和 5 倍”,没有接受的答案
        【解决方案5】:

        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"
        

        【讨论】:

          【解决方案6】:
          >>> x = 'it is icy'.replace('i', '', 1)
          >>> x
          't is icy'
          

          由于您的代码只会替换第一个实例,我认为这就是您想要的。如果您想全部替换它们,请不要使用 1 参数。

          由于您无法替换字符串本身中的字符,因此您必须将其重新分配回变量。 (本质上,您必须更新引用而不是修改字符串。)

          【讨论】:

            猜你喜欢
            • 2014-09-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-03
            • 2018-09-23
            • 2010-11-04
            • 2012-06-16
            相关资源
            最近更新 更多