首页 > 解决方案 > 程序没有按应有的方式工作?

问题描述

我被告知要编写一个程序来查找字符串中子字符串的最后位置。它似乎在输出虚假信息,我不确定我哪里出错了。

任何人都可以帮忙吗?

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

标签: python

解决方案


每次您打电话时,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

推荐阅读