3 回答
TA贡献1816条经验 获得超4个赞
每次调用时,s.find()
您只使用上一次匹配后的子字符串。所以last_position
不会是原始字符串中的位置,而是该子字符串中的位置。
如果您使用更复杂的字符串,则更容易看到发生了什么,例如
find_last('abcaxya34', 'a')
第一次通过循环时s = 'abcaxya34'
,它a
在 index 处找到0
。然后它从字符串的开头删除该匹配项。
第二次通过循环s = 'bcaxya34'
,它a
在索引处找到3
。然后它从字符串的开头删除该匹配项。
第三次通过循环,s = 'xya34'
,它a
在 index 处找到3
。然后它从字符串的开头删除该匹配项。
第四次通过循环,s = '34'
。这次它没有找到a
,所以循环结束。然后它返回上一次迭代的位置,即3
。但这只是最后一个成功子字符串中的索引,而不是原始字符串中的索引。
str.find()
允许您提供可选的起始索引,您可以使用它而不是每次都对字符串进行切片。
def find_last(s, c):
last_position = 0
result = -1
while True:
next_position = s.find(c, last_position)
if next_position == -1:
break
result = next_position
last_position = next_position + len(c)
return result
TA贡献1848条经验 获得超2个赞
尝试(从右向左扫描)
def find_last(s, c):
for x in range(len(s)-1, 0, -1):
if s[x] == c:
return x
return -1
添加回答
举报