Python的replace()函数意外地删除了多个doubleoccurrence字符

2024-06-02 07:16: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”。我已经用十几个输出正确的字符串测试过了,除了一个奇怪的例子:

字符串“Hello”生成“eo”而不是“elo”。仔细检查后,python正在删除双重出现,例如“ll”。为什么会这样?你知道吗


Tags: 字符串代码inhelloforinputlenif
3条回答

调用s.replace就是在整个字符串s上调用replace,它替换所有出现的s[i],除非向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)

我认为您也可以跳过使用replace,更精确地更改一个字符,将if下的代码更改为:

t = list(s)
t[i] = ' '
s = "".join(t)

这是因为replace方法用替换字符串替换字符串的每一次出现。当替换l时,Hello的第三个字符,它也用''替换另一个l。你知道吗

这就是^{}所做的:

Return a copy of the string with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced.

实际上,您在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

相关问题 更多 >