Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Equivelant to rindex for lists in Python [duplicate]

Tags:

python

list

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.

like image 350
Kelketek Avatar asked Mar 23 '12 09:03

Kelketek


People also ask

How do you find the index of a duplicate in Python?

Method #1 : Using loop + set() This task can be solved using the combination of above functions. In this, we just insert all the elements in set and then compare each element's existence in actual list. If it's the second occurrence or more, then index is added in result list.

Can lists in Python have duplicates?

Python list can contain duplicate elements.


3 Answers

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
like image 198
EwyynTomato Avatar answered Oct 19 '22 04:10

EwyynTomato


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.

like image 30
steveha Avatar answered Oct 19 '22 05:10

steveha


This should work:

for index, item in enumerate(reversed(a)):
    if item == "hello":
        print len(a) - index - 1
        break
like image 38
Kien Truong Avatar answered Oct 19 '22 04:10

Kien Truong