Python按索引从字符串中删除字符的最佳方法
Posted
技术标签:
【中文标题】Python按索引从字符串中删除字符的最佳方法【英文标题】:Python best way to remove char from string by index 【发布时间】: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 - 请改写您的问题以包含您预期的字符串大小。 (或完全问另一个问题) 【参考方案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
【讨论】:
以上是关于Python按索引从字符串中删除字符的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
根据字符的字符从句子数组中删除重复句子的最佳方法,空格无关紧要