Python的replace()函数意外删除了多个重复出现的字符

时间:2018-07-04 02:57:30

标签: python

我有一段代码应该从索引可被3整除的字符串中删除每个字母。

s = input()

len = len(s)

for i in range(0, len):
    if i % 3 == 0:
        s = s.replace(s[i], ' ')

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

例如,字符串“ Python”会产生预期的“ yton”。我已经用十几个具有正确输出的字符串进行了测试,其中 except 用于一种奇怪的情况:

字符串“ Hello”产生“ eo”而不是“ elo”。经过仔细检查,python正在删除重复出现的事件,例如“ ll”。为什么会这样?

3 个答案:

答案 0 :(得分:5)

这是replace的作用:

  

返回字符串的副本,并用所有出现的子字符串 old 替换为 new 如果可选参数 count ,只有第一个 count 个出现被替换。

您实际上在replace(' ', '')通话中完全依赖于该行为。

如果您不想这样做,请不要使用replace。 (实际上,s.replace(s[i], …)的几乎任何使用都存在此问题,因此,只要发现有写问题,请当心。)

例如,您可以使用切片:

s = s[:i] + ' ' + s[i+1:]

或者,甚至更好,只需建立一个字符列表并在末尾join

s = input()
lst = []
for i in range(len(s)):
    if i % 3:
        lst.append(s[i])
s = ''.join(lst)

…您甚至可以将其浓缩为单线:

s = ''.join(c for i, c in enumerate(s) if i % 3)

如果确实不允许使用join,则可以使用字符串串联执行相同的逻辑-效率低下且惯用:

s = input()
t = ''
for i in range(len(s)):
    if i % 3:
        t += s[i]
s = t

或者,只是为了好玩,将所有复杂度放入范围和切片中,所以您甚至不需要%

s = input()
t = ''
for i in range(1, len(s), 3):
    t += s[i:i+2]
s = t

答案 1 :(得分:1)

这是因为replace方法用替换字符串替换了每次出现的字符串。当您替换{{1}的第三个字符l时,它也会用Hello替换另一个l

答案 2 :(得分:0)

通过调用referer-not-allowed-map-error,您将在整个字符串s.replace上调用replace,它将替换所有出现的s,除非您向s[i]传递了第三个参数以限制替换发生的次数。

请尝试以下方法:

replace()

我认为您也可以跳过使用replace并更精确地更改一个字符,将s = input() len = len(s) for i in range(0, len): if i % 3 == 0: s = s.replace(s[i], ' ', 1) s = s.replace(' ', '') print(s) 下的代码更改为:

if