Как вернуть последний индекс списка Python

Возможный дубликат:
Нахождение первого и последнего индекса некоторого значения в списке в Python

Привет, мне было интересно, может ли кто-нибудь помочь мне с Python. Я пытаюсь создать код, который возвращает последний индекс последнего вхождения элемента в списке рекурсивным способом. Так в списке [1,2,3,4,5,2] последнее должно вернуться 4, Он принимает только 2 переменные, которые представляют собой список и элемент, который он ищет. Если он не находит подходящую переменную, он возвращает -1,

Пока у меня есть это:

def lstIndex(lst, item):
    if len(lst) == 0:
        return -1
    place = lst[0]
    if place == item:
        print(place)
        #just return the index
        return lst.index(place)
    else:
        return lstIndex(lst[1:],item)

5 ответов

Решение

Я не совсем на 100% уверен, что знаю, чего ты хочешь. Ваше утверждение о том, что "... в списке [1,2,3,4,5,2] последнего должно возвращаться 4 ..." меня немного смущает; Я думаю, что вы хотите вернуть индекс последнего появления вашего указанного item, Таким образом, для 4, чтобы быть результатом в указанном списке, item должно быть 5.

Как отмечалось в другом месте, рекурсивная функция не будет самым эффективным или Pythonic решением здесь. Я бы предпочел решение, подобное первому в ответе nneonneo.

Однако, если он должен быть рекурсивным, я думаю, что приведенный ниже код получит то, что вы хотите. Вместо того, чтобы переходить по списку с фронта (используя [1:]), вам нужно сделать шаг назад, используя [:-1] в качестве диапазона индекса при передаче списка в рекурсивном вызове:

def lstIndex(lst, item):
    if len(lst) == 0:
        return -1
    elif lst[-1] == item:
        return len(lst) - 1
    else:
        return lstIndex(lst[0:-1], item)

Я проверил со следующим:

the_list = [1,2,3,4,5,2]
print lstIndex(the_list, 2)
print lstIndex(the_list, 1)
print lstIndex(the_list, 3)
print lstIndex(the_list, 4)
print lstIndex(the_list, 5)
print lstIndex(the_list, 6)
print lstIndex(the_list, 0)

Со следующим выводом:

5
0
2
3
4
-1
-1

Если рекурсия не нужна, вы можете использовать это:

def find_last(lst,item):
    try:
       return len(lst) - next(i for i,elem in enumerate(reversed(lst),1) if elem == item)
    except StopIteration:
       return -1


a = [1,2,3,4,5,4,3]
idx = find_last(a,4)
print a[idx]
print find_last(a,6)

Краткое итерационное решение:

try:
    return (len(lst)-1) - lst[::-1].index(item)
except ValueError:
    return -1

Но, поскольку вы явно ищете рекурсивное решение, я покажу вам, как это можно сделать рекурсивно. Тем не менее, это не будет эффективным; если вам нужно хорошее, эффективное решение Pythonic, вы должны использовать итеративное решение, подобное тому, которое показали другие (или приведенное выше).

На самом деле есть несколько способов сделать это. Вы можете использовать вспомогательную функцию, которая принимает дополнительный аргумент, указывающий последний индекс, по которому было найдено значение:

def list_rfind(lst, item):
    def list_rfind_helper(i, item, last=-1):
        if i >= len(lst): return last
        if lst[i] == item: last = i
        return list_rfind_helper(i+1, item, last)

    return list_rfind_helper(0, item)

Вы можете сделать это без вспомогательной функции:

def list_rfind(lst, item):
    if not lst:
        return -1

    res = list_rfind(lst[1:], item)
    if res >= 0:
        return res+1
    elif lst[0] == item:
        return 0
    else:
        return -1
lst = [1, 2, 3, 4, 3, 4]

findLast(lst, 4)

def findLast(lst, item):
    for i, val in enumerate(reversed(lst)):
        if val == item:
            return len(lst) - (i + 1)  # Return index of matched item

    return -1

Просто для полноты:

def list_rfind(lst, item):
    return (len(lst)-1) - sum(1 for _ in iter(reversed(lst).next, item))
Другие вопросы по тегам