2012-03-23 11 views
6

¿Hay una manera eficiente de encontrar el último elemento coincidente en una lista? Cuando se trabaja con cadenas, se puede encontrar el último elemento con rindex:Equivelant a rindex para listas en Python

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

... Pero este método no existe para las listas:

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

¿Hay una manera de conseguir esto sin tener para construir un gran bucle? Preferiría no utilizar el método inverso si se puede evitar, ya que el orden es importante y también tendría que hacer un poco de matemática extra para averiguar dónde se encontraba el objeto/would/have. Esto parece un desperdicio

Editar:

Para aclarar, necesito el número de índice de este artículo.

+5

http://stackoverflow.com/questions/6890170/python-how-to-find-last-occurrence-in-a-list-in-python –

+1

Use 'invertidos (a) ', crea un iterador inverso y no modifica la lista. – Dikei

+0

Dikei, ¿podría darme un ejemplo como respuesta? Con mucho gusto lo seleccionaré si funciona. – Kelketek

Respuesta

12

¿Qué tal:

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

Editar (puso en función de como se sugiere):

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

¡Me gusta! Sin embargo, debes empaquetarlo en una función. – steveha

5

Esto debería funcionar:

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

escribí una función de Python sencillo, y aquí es:

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 

Pero mientras lo estaba probando, EwyynTomato publicó una mejor respuesta. Use la maquinaria de "rebanado" para invertir la lista y use el método .index().

0

Soporta 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