12

Is there an efficient way to find the last matching item in a list? When working with strings, you can find the last item with rindex:

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

...But this method doesn't exist for lists:

    >>> 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'

Is there a way to get this without having to construct a big loop? I'd prefer not to use the reverse method if it can be avoided, as the order is important and I'd also have to do a bit of extra math to find out where the object /would/ have been. This seems wasteful.

Edit:

To clarify, I need the index number of this item.

Kelketek
  • 2,316
  • 5
  • 19
  • 27

4 Answers4

19

How about:

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

Edit (put in function as suggested):

def listRightIndex(alist, value):
    return len(alist) - alist[-1::-1].index(value) -1
EwyynTomato
  • 3,879
  • 1
  • 29
  • 39
  • 5
    This isn't a good solution. It works, but creates a copy of the whole list. Not reasonable for the use-case. – Guy Oct 10 '18 at 08:45
6

This should work:

for index, item in enumerate(reversed(a)):
    if item == "hello":
        print len(a) - index - 1
        break
Kien Truong
  • 10,866
  • 2
  • 28
  • 34
4

I wrote a straightforward Python function, and here it is:

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

But while I was testing it, EwyynTomato posted a better answer. Use the "slicing" machinery to reverse the list and use the .index() method.

steveha
  • 71,436
  • 20
  • 89
  • 116
0

Supports 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
mpen
  • 256,080
  • 255
  • 805
  • 1,172