【问题标题】:Python best way to remove char from string by indexPython按索引从字符串中删除字符的最佳方法
【发布时间】:2016-10-30 05:27:51
【问题描述】:

我正在从这样的字符串中删除一个字符:

S = "abcd"
Index=1 #index of string to remove
ListS = list(S)
ListS.pop(Index)
S = "".join(ListS)
print S
#"acd"

我确信这不是最好的方法。

编辑 我没有提到我需要操纵长度为 ~ 10^7 的字符串大小。 所以关注效率很重要。

谁能帮帮我。哪种pythonic方式来做到这一点?

【问题讨论】:

  • @span 请注意这个问题。它不是重复的。
  • 重复,请看链接问题的第一个答案。
  • 非常重复。所有的答案也几乎是重复的(包括我自己的)。
  • 投票支持重新打开,因为 OP 想要一个可行的解决方案来处理大约 10^7 个元素的序列 - 标记为重复的问题是针对“普通”字符串大小的。
  • @alvaro - 请改写您的问题以包含您预期的字符串大小。 (或完全问另一个问题)

标签: python string python-2.7 python-3.x substring


【解决方案1】:

您可以通过切片绕过所有列表操作:

S = S[:1] + S[2:]

或更一般地

S = S[:Index] + S[Index + 1:]

您的问题的许多答案(包括这样的答案)都可以在这里找到:How to delete a character from a string using python?。然而,这个问题名义上是关于按值删除,而不是按索引。

【讨论】:

  • 那是最有效的方法吗?似乎不是pythonic。就像我想要的那样工作。
  • 你为什么关心最有效的方式?字符串的大小是多少?您多久从中删除一个字符?
  • @AlvaroJoao。没有从字符串中删除元素的“有效”方法。 Python 中的字符串是不可变的。这意味着无论如何您都必须创建临时容器和新的最终字符串。如果您想要高效,您可以执行类似扩展list 并实现自定义__str__ 方法。
  • 字符串大小 10^7。问题是寻找回文并删除 char 直到字符串变成回文所以我想我需要关心效率。
  • @AlvaroJoao 然后保留字符列表而不是字符串,列表是可变的,不需要创建副本来更改。
【解决方案2】:

切片是我能想到的最好和最简单的方法,这里有一些其他选择:

>>> s = 'abcd'
>>> def remove(s, indx):
        return ''.join(x for x in s if s.index(x) != indx)

>>> remove(s, 1)
'acd'
>>> 
>>> 
>>> def remove(s, indx):
        return ''.join(filter(lambda x: s.index(x) != 1, s))

>>> remove(s, 1)
'acd'

记住索引是从零开始的。

【讨论】:

    【解决方案3】:

    您可以将索引字符替换为“”。

    str = "ab1cd1ef"
    Index = 3
    print(str.replace(str[Index],"",1))
    

    【讨论】:

    • 这对于Index = 2 将无法正常工作,因为它还会删除5 的值。
    • 如果在替换中加1?将替换限制为一次。 @MadPhysicist
    • 修改了我的答案,现在 Index = 2 将得到处理,请投票..谢谢
    • 好的。如果我想替换Index = 5怎么办?我的观点是,在一般情况下,按值删除/替换永远不会是按索引删除/替换的安全替代方案,所以不要赞成。
    • @MadPhysicist 你是绝对正确的。你刚才明白了。
    【解决方案4】:
    S = "abcd"
    Index=1 #index of string to remove
    S = S.replace(S[Index], "")
    print(S)
    

    希望对你有帮助!

    【讨论】:

    • 如果S = "zzzz",我收到empty,但它应该返回zzz
    • @0Knowledge S.replace(S[index], "", 1)
    【解决方案5】:
    def missing_char(str, n):
    
      n = abs(n)
      front = str[:n]   # up to but not including n
      back = str[n+1:]  # n+1 through end of string
      return front + back
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 2021-05-21
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多