【问题标题】:How to delete a character from a string using Python如何使用 Python 从字符串中删除一个字符
【发布时间】:2011-04-03 08:09:19
【问题描述】:

例如,有一个字符串。 EXAMPLE.

如何从中删除中间字符,即M?我不需要代码。我想知道:

  • Python 中的字符串是否以任何特殊字符结尾?
  • 哪种方法更好 - 从中​​间字符开始将所有内容从右向左移动,或者创建一个新字符串而不复制中间字符?

【问题讨论】:

标签: python string


【解决方案1】:

在 Python 中,字符串是不可变的,因此您必须创建一个新字符串。对于如何创建新字符串,您有几个选项。如果您想在出现的任何地方删除“M”:

newstr = oldstr.replace("M", "")

如果要删除中心字符:

midlen = len(oldstr) // 2
newstr = oldstr[:midlen] + oldstr[midlen+1:]

您询问字符串是否以特殊字符结尾。不,你像 C 程序员一样思考。在 Python 中,字符串是stored with their length,因此任何字节值,包括\0,都可以出现在字符串中。

【讨论】:

  • 鉴于提问者对 python 来说是全新的,可能值得注意的是,在版本 2.X python 中,“/”运算符返回一个整数(截断为零),在版本 3.X python 你应该改用“//”。此外,脚本开头的 from __future__ import division 行将使 2.X 版 python 的行为类似于 3.X 版
  • 请注意,如果“M”是该行的唯一内容,“”会在其位置留下一个空行。
  • @7SpecialGems 这完全取决于你用这个字符串做什么。像"" 这样的空字符串并不意味着空行。如果你把它放在一个列表中,并用换行符加入它,那么它会变成一个空行,但是还有很多其他地方你可能会使用一个不会这样做的空字符串。
  • Under the hood,Python 中的字符串也是空终止的,但这没关系。
【解决方案2】:

替换特定位置:

s = s[:pos] + s[(pos+1):]

替换特定字符:

s = s.replace('M','')

【讨论】:

  • 虽然这可能有效,但我认为您的答案可以通过解释第一部分发生的事情来改进,因为对于 Python 新手来说,没有任何解释的子字符串操作不一定容易理解。
  • 所以如果s的长度是l。那么对于第一部分,pos 的约束应该是l-1 > pos >= 0
  • s[:pos] 获取从 0 到 pos-1 的子字符串,s[(pos+1):] 获取从 pos+1 到 end 的子字符串。因此,它从 s 中删除 s[pos]。
  • 它没有替换,它正在下降。通过提供两个主要用例的示例来区分操作是很好的,通过它们的位置选择方法来区分。
【解决方案3】:

这可能是最好的方法:

original = "EXAMPLE"
removed = original.replace("M", "")

不用担心转换字符等。大多数 Python 代码都发生在更高级别的抽象上。

【讨论】:

  • M 可能不是唯一的。在那种情况下,这将替换所有Ms,对吧?
  • 是的,没错。如果您只想替换出现的n,请使用original.replace("M", "", n)
【解决方案4】:

字符串是不可变的。但是您可以将它们转换为一个可变的列表,然后在更改列表后将其转换回字符串。

s = "this is a string"

l = list(s)  # convert to list

l[1] = ""    # "delete" letter h (the item actually still exists but is empty)
l[1:2] = []  # really delete letter h (the item is actually removed from the list)
del(l[1])    # another way to delete it

p = l.index("a")  # find position of the letter "a"
del(l[p])         # delete it

s = "".join(l)  # convert back to string

您还可以创建一个新字符串,正如其他人所展示的那样,通过从现有字符串中获取所有除了您想要的字符。

【讨论】:

  • 为什么不直接使用str.replace 方法?
【解决方案5】:

如何删除中间字符,即 M?

你不能,因为 Python 中的字符串是 immutable

Python 中的字符串是否以任何特殊字符结尾?

没有。它们类似于字符列表;列表的长度定义了字符串的长度,没有字符作为终止符。

哪种方法更好 - 从中​​间字符开始将所有内容从右向左移动,或者创建一个新字符串而不复制中间字符?

您无法修改现有字符串,因此您必须创建一个新字符串,其中包含除中间字符之外的所有内容。

【讨论】:

    【解决方案6】:

    使用translate() 方法:

    >>> s = 'EXAMPLE'
    >>> s.translate(None, 'M')
    'EXAPLE'
    

    【讨论】:

    • 方法变了。请参阅 Python 3 的文档:translate() 这用空格替换不同的字符(None 删除似乎不起作用):translate( str.maketrans("<>", " ") )
    • 实际上,文档指定了两种在 Python 3 中使用 translate() 删除不同字符的方法:str.maketrans( "", "", "<>")str.maketrans( {"<":None,">":None })
    • 相当于答案中的代码在python3中变成了这样:'EXAMPLE'.translate({ord("M"): None})
    【解决方案7】:
    def kill_char(string, n): # n = position of which character you want to remove
        begin = string[:n]    # from beginning to n (n not included)
        end = string[n+1:]    # n+1 through end of string
        return begin + end
    print kill_char("EXAMPLE", 3)  # "M" removed
    

    我在某个地方看到过这个 here

    【讨论】:

      【解决方案8】:
      card = random.choice(cards)
      cardsLeft = cards.replace(card, '', 1)
      

      如何从字符串中删除一个字符: 这是一个示例,其中有一堆卡片,表示为字符串中的字符。 其中一个被绘制(为 random.choice() 函数导入随机模块,该模块在字符串中选择一个随机字符)。 创建了一个新的字符串cardsLeft来保存由字符串函数replace()给出的剩余卡片,其中最后一个参数表示只有一个“卡片”将被空字符串替换......

      【讨论】:

        【解决方案9】:

        Python 2 上,您可以使用 UserString.MutableString 以可变方式执行此操作:

        >>> import UserString
        >>> s = UserString.MutableString("EXAMPLE")
        >>> type(s)
        <class 'UserString.MutableString'>
        >>> del s[3]    # Delete 'M'
        >>> s = str(s)  # Turn it into an immutable value
        >>> s
        'EXAPLE'
        

        MutableString 在 Python 3 中被移除。

        【讨论】:

        • 404 网站无导入
        【解决方案10】:

        另一种方法是使用函数,

        下面是一种从字符串中删除所有元音的方法,只需调用函数

        def disemvowel(s):
            return s.translate(None, "aeiouAEIOU")
        

        【讨论】:

        • 你的意思是s.translate(str.maketrans("", "", "aeiouAEIOU"))
        • @DynoFu 我认为这就是他的意思,因为您的答案是整个线程中唯一有意义的答案。如果您需要删除其他字符,其他所有字符都会变得非常复杂。
        【解决方案11】:

        这是我切掉“M”的方法:

        s = 'EXAMPLE'
        s1 = s[:s.index('M')] + s[s.index('M')+1:]
        

        【讨论】:

        • 这只适用于这个特定的字符串,不是通用的解决方案。
        【解决方案12】:

        要删除charsub-string一次(仅第一次出现):

        main_string = main_string.replace(sub_str, replace_with, 1)
        

        注意:这里的1 可以替换为任何int,以替换您要替换的出现次数。

        【讨论】:

          【解决方案13】:

          您可以简单地使用列表推导。

          假设您有字符串:my name is,并且您想要删除字符 m。使用以下代码:

          "".join([x for x in "my name is" if x is not 'm'])
          

          【讨论】:

            【解决方案14】:

            如果你想删除/忽略字符串中的字符,例如,你有这个字符串,

            “[11:L:0]”

            来自 Web API 响应或类似的东西,例如 CSV 文件,假设您正在使用请求

            import requests
            udid = 123456
            url = 'http://webservices.yourserver.com/action/id-' + udid
            s = requests.Session()
            s.verify = False
            resp = s.get(url, stream=True)
            content = resp.content
            

            循环并删除不需要的字符:

            for line in resp.iter_lines():
              line = line.replace("[", "")
              line = line.replace("]", "")
              line = line.replace('"', "")
            

            可选拆分,您将能够单独读取值:

            listofvalues = line.split(':')
            

            现在访问每个值更容易了:

            print listofvalues[0]
            print listofvalues[1]
            print listofvalues[2]
            

            这将打印出来

            11

            L

            0

            【讨论】:

              【解决方案15】:

              Python 3.9+中引入了两种新的字符串删除方法

              #str.removeprefix("prefix_to_be_removed")
              #str.removesuffix("suffix_to_be_removed")
              
              s='EXAMPLE'
              

              在这种情况下,'M' 的位置是 3

              s = s[:3] + s[3:].removeprefix('M')
              

              s = s[:4].removesuffix('M') + s[4:]
              
              #output'EXAPLE'
              

              【讨论】:

                【解决方案16】:
                from random import randint
                
                
                def shuffle_word(word):
                    newWord=""
                    for i in range(0,len(word)):
                        pos=randint(0,len(word)-1)
                        newWord += word[pos]
                        word = word[:pos]+word[pos+1:]
                    return newWord
                
                word = "Sarajevo"
                print(shuffle_word(word))
                

                【讨论】:

                • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
                【解决方案17】:

                字符串在 Python 中是不可变的,因此您的两个选项基本上意味着相同的事情。

                【讨论】:

                  猜你喜欢
                  • 2014-07-30
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-03-14
                  • 1970-01-01
                  相关资源
                  最近更新 更多