2012-03-23 15 views
6

Esiste un modo efficace per trovare l'ultimo elemento corrispondente in un elenco? Quando si lavora con le stringhe, è possibile trovare l'ultima voce con RINDEX:Equivale a rindex per gli elenchi in Python

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

... Ma questo metodo non esiste per le liste:

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

C'è un modo per ottenere questo senza dover costruire un grande anello? Preferirei non usare il metodo inverso se può essere evitato, in quanto l'ordine è importante e dovrei anche fare un po 'di matematica extra per scoprire dove l'oggetto sarebbe/sarebbe stato. Questo sembra uno spreco.

Edit:

Per chiarire, ho bisogno del numero di indice di questo oggetto.

+5

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

+1

Usa 'invertiti (a) ', crea un iteratore inverso e non modifica l'elenco. – Dikei

+0

Dikei, potresti darmi un esempio come risposta? Lo selezionerò volentieri se funziona. – Kelketek

risposta

12

ne dite:

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

Edit (messo in funzione come suggerito):

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

Mi piace! Dovresti comprimerlo in una funzione, però. – steveha

5

Questo dovrebbe funzionare:

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

ho scritto una funzione Python semplice, e qui è:

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 

Ma mentre lo stavo testando, EwyynTomato ha pubblicato una risposta migliore. Utilizzare la macchina "slicing" per invertire l'elenco e utilizzare il metodo .index().

0

Supporta 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 
Problemi correlati