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

vor*_*sbn 0 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)
Run Code Online (Sandbox Code Playgroud)

例如,字符串"Python"按预期生成"yton".除了一个奇怪的案例,我用十几个正确输出的字符串对此进行了测试:

字符串"Hello"产生"eo"而不是"elo".经过仔细检查,python正在消除双重现象,例如"ll".为什么会这样?

aba*_*ert 5

这是做什么的replace:

返回字符串的副本,其中所有出现的substring old都替换为new.如果给出可选参数计数,则仅替换第一次计数.

你实际上是在你的replace(' ', '')通话中完全依赖于这种行为.

如果您不想这样,请不要使用replace.(事实上​​,几乎任何使用s.replace(s[i], …)都有这个问题,所以每当你发现自己写的时候要小心.)

例如,您可以使用切片:

s = s[:i] + ' ' + s[i+1:]
Run Code Online (Sandbox Code Playgroud)

或者,甚至可能更好,只需在最后建立一个字符列表和join它们:

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

......你甚至可以凝聚成一个单行:

s = ''.join(c for i, c in enumerate(s) if i % 3)
Run Code Online (Sandbox Code Playgroud)

如果您真的不被允许使用join,您可以使用字符串连接执行相同的逻辑 - 效率和惯用效率较低:

s = input()
t = ''
for i in range(len(s)):
    if i % 3:
        t += s[i]
s = t
Run Code Online (Sandbox Code Playgroud)

或者,只是为了好玩,将所有复杂性放在范围和切片中,这样你甚至不需要%:

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