我有一个代码块,应该删除索引可被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".为什么会这样?
这是做什么的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)
| 归档时间: |
|
| 查看次数: |
54 次 |
| 最近记录: |