Equivelant to rindex для списков в Python

Есть ли эффективный способ найти последний соответствующий элемент в списке? При работе со строками вы можете найти последний элемент с rindex:

    >>> a="GEORGE"
    >>> a.rindex("G")
    4

... Но этот метод не существует для списков:

    >>> a=[ "hello", "hello", "Hi." ]
    >>> a.rindex("hello")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'list' object has no attribute 'rindex'

Есть ли способ получить это без создания большого цикла? Я бы предпочел не использовать обратный метод, если его можно избежать, так как порядок важен, и мне также нужно было бы сделать немного дополнительной математики, чтобы выяснить, где был / будет / был объект. Это кажется расточительным.

Редактировать:

Чтобы уточнить, мне нужен номер индекса этого элемента.

4 ответа

Решение

Как насчет:

len(a) - a[-1::-1].index("hello") - 1

Изменить (ввести в действие, как предложено):

def listRightIndex(alist, value):
    return len(alist) - alist[-1::-1].index(value) -1

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

for index, item in enumerate(reversed(a)):
    if item == "hello":
        print len(a) - index - 1
        break

Я написал простую функцию Python, и вот она:

def list_rindex(lst, item):
    """
    Find first place item occurs in list, but starting at end of list.
    Return index of item in list, or -1 if item not found in the list.
    """
    i_max = len(lst)
    i_limit = -i_max
    i = -1
    while i > i_limit:
        if lst[i] == item:
            return i_max + i
        i -= 1
    return -1

Но пока я тестировал его, EwyynTomato опубликовал лучший ответ. Используйте механизм "нарезки", чтобы перевернуть список и использовать .index() метод.

Опоры start:

def rindex(lst, val, start=None):
    if start is None:
        start = len(lst)-1
    for i in xrange(start,-1,-1):
        if lst[i] == val:
            return i
Другие вопросы по тегам