Эквивалент 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'

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

Изменить:

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


person Kelketek    schedule 23.03.2012    source источник
comment
stackoverflow.com/questions/6890170/   -  person Martin Flucka    schedule 23.03.2012
comment
Используйте reversed(a), он создает обратный итератор и не изменяет список.   -  person Kien Truong    schedule 23.03.2012
comment
Дикей, не могли бы вы привести пример в качестве ответа? Я с удовольствием выберу его, если он работает.   -  person Kelketek    schedule 23.03.2012
comment
reversed объекты не имеют index() метода   -  person kosii    schedule 23.03.2012


Ответы (4)


Как насчет:

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

Изменить (ввести функцию, как было предложено):

def listRightIndex(alist, value):
    return len(alist) - alist[-1::-1].index(value) -1
person EwyynTomato    schedule 23.03.2012
comment
Это не очень хорошее решение. Он работает, но создает копию всего списка. Не разумно для варианта использования. - person Guy; 10.10.2018

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

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

Я написал простую функцию 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().

person steveha    schedule 23.03.2012

Поддерживает 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
person mpen    schedule 09.07.2012