python - 程序没有按应有的方式工作?
问题描述
我被告知要编写一个程序来查找字符串中子字符串的最后位置。它似乎在输出虚假信息,我不确定我哪里出错了。
任何人都可以帮忙吗?
def find_last(s, c):
last_position = -1
while s.find(c) != -1:
last_position = s.find(c)
s = s[last_position + len(c):]
return last_position
print(find_last('aaaa', 'a')) # returns 0, but the last position is 3
解决方案
每次您打电话时,s.find()
您都在使用前一场比赛之后的子字符串。所以last_position
不会是原始字符串中的位置,而是该子字符串中的位置。
如果您使用更复杂的字符串,则更容易看到发生了什么,例如
find_last('abcaxya34', 'a')
第一次通过循环s = 'abcaxya34'
,它找到a
了 index 0
。然后它从字符串的开头删除该匹配项。
第二次通过循环s = 'bcaxya34'
,它a
在 index 处找到3
。然后它从字符串的开头删除该匹配项。
第三次通过循环,s = 'xya34'
找到a
索引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
推荐阅读
- apache-spark - 如何在 Spark Streaming 应用程序中使用 Kafka 主题?
- actions-on-google - 智能家居温度设置读数(摄氏度)自定义范围
- c# - 某些 Unicode 字符不是使用 DrawString 方法绘制的
- c - 与 C 相比,为什么 Go 向文件写入字节很慢
- ocaml - 为什么我不能在 OCaml 中再次打印此输入?
- amazon-web-services - 站点未部署在 AWS S3 上
- java - 未安装所需的插件“org.jetbrains.idea.maven”
- jquery - 单击复选框时添加和删除 div
- ios - 在集合视图中调整图像大小
- javascript - 在 React 的特定输入字段中键入文本后,如何启用按钮?