Что я должен сделать, чтобы найти последнее вхождение строки? - PullRequest
1 голос
/ 20 апреля 2020

В настоящее время я прохожу курс Udacity CS101 (я начинающий). Вот последний тест урока 2: Определите процедуру find_last, которая принимает в качестве входных данных две строки, строку поиска и целевую строку и возвращает последнюю позицию в строке поиска, где появляется целевая строка, или -1, если есть нет случаев.

Пример: find_last ('aaaa', 'a') возвращает 3.

Вот код, который я написал:

    def find_last(s,t):
        i=s.find(t)
        if i==-1:
            return -1
        else:
            while True:
                return (s.find(t,i+1))
                i=i+1
            return s.find(t)
    print(find_last('he is','he')

Этот код не работает для большинство тестовых случаев. Например, здесь я ожидаю вывод 0, но я получаю вывод -1 («он» определенно существует в «он есть», поэтому вывод не может быть -1). Пожалуйста, помогите.

Ответы [ 4 ]

4 голосов
/ 20 апреля 2020

Подсчет справа

Поиск в конце строки. Вы можете использовать str.rfind() для этого:

def find_last(s, t, cheat=True):
   if cheat:
       return s.rfind(t)
   else:
       for i in range(len(s), len(t) - 1, -1):
            if s[i - len(t):i] == t:
                return i-len(t)                
       return -1  

print(find_last('he is he', 'he'))

Вывод

6

Подсчет слева

Если вы придерживаетесь своего al go, который считается от Слева вы можете сделать следующее:

def find_last(s,t):
    i = -1
    while True:
        new_i = s.find(t, i + 1)
        if new_i == -1:
            return i
        i = new_i
    return i
print(find_last('aaaa','a'))

Выход

3
4 голосов
/ 20 апреля 2020

Поскольку это курс, я не дам вам ответ. Вот что нужно учитывать.

Предположим, что наша строка = "Это предложение является предложением"

Предположим, что наш поисковый термин = "отправлено"

Если вы начинаете с начала строки, вам придется перебирать большую часть строки. Что если вы перевернете свой поисковый термин и выполните поиск с конца строки?

Теперь ваш поисковый термин "tnes"

Если вы начинаете с конца Строка, вы будете использовать для l oop с отрицательным приращением.

2 голосов
/ 20 апреля 2020

Это должно работать:

try:
    string ="Hello WorldHello World"
    query = "hey"
    index = string.lower().rindex(query.lower())
except ValueError:
    index = -1
print(index)

Вывод:

-1

Когда запрос был "привет", давал 11

Это работает, даже если строка дело другое. Python строковый метод rindex () возвращает последний индекс, в котором найдена подстрока str, or raises an exception if no such index exists. https://www.tutorialspoint.com/python/string_rindex.htm

1 голос
/ 20 апреля 2020

В соответствии с вашим подходом начинать с фронта и работать через строку и предполагая, что вы не просто хотите использовать встроенную функцию rfind(), вы можете l oop с index(). Требуется второй параметр, который сообщает, с чего начать поиск. Это вызовет исключение, когда не может найти подстроку, которую вы можете перехватить и использовать как способ завершить вашу функцию. Это делает его очень лаконичным и pythoni c. Вы просто устанавливаете начальный индекс на -1 и обновляете его до тех пор, пока не появится это исключение:

def find_last(s,t):
    ind = -1
    while True:
        try:
            ind = s.index(t, ind + 1)  
        except ValueError:
            return ind

s = "this_is_a_test"
find_last(s, 'is')
# 4
find_last(s, 't')
# 13
find_last(s, 'z')
# -1
...