我有一段代码应该从索引可被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”。为什么会这样?
答案 0 :(得分:5)
这是replace
的作用:
返回字符串的副本,并用所有出现的子字符串 old 替换为 new 。如果可选参数 count 给出了em>,只有第一个 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