程序不能以应有的方式工作?

时间:2019-03-17 16:49:05

标签: 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

5 个答案:

答案 0 :(得分:2)

每次调用s.find()时,您只是在上一场比赛之后使用子字符串。因此,last_position不会是原始字符串中的位置,而是该子字符串中的位置。

例如,如果使用更复杂的字符串,则更容易看到正在发生的情况。

find_last('abcaxya34', 'a')

第一次通过循环s = 'abcaxya34',它在索引a处找到0。然后从字符串开头删除该匹配项。

第二遍循环s = 'bcaxya34',它在索引a处找到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

答案 1 :(得分:1)

您可以使用rfind()来获取最后一个字符的位置。

答案 2 :(得分:0)

尝试(从右到左扫描)

def find_last(s, c):
    for x in range(len(s)-1, 0, -1):
        if s[x] == c:
            return x
    return -1

答案 3 :(得分:0)

您可以进行简单的for循环。 如果仅键入s.find(c),它将在c中看到第一个s,这意味着如果您添加count = 0,则return将现在为0,并且每当s在c中加1,它将返回该位置。

答案 4 :(得分:0)

颠倒两个字符串:

def find_last(s, c):
    pos = s[::-1].find(c[::-1])
    if pos != -1:
        pos = len(s) - len(c) - pos
    return pos