2009-02-06 13 views
35

È stato rilevato qualche metodi incorporati che fanno parte delle liste che mi avrebbe dato il primo e l'ultimo indice di un certo valore, come:Trovare primo e l'ultimo indice di un certo valore in una lista in Python

verts.IndexOf(12.345) 
verts.LastIndexOf(12.345) 
+1

Forse dovresti leggere le liste nei documenti Python: http://docs.python.org/library/stdtypes.html#mutable-sequence-types. Penso che sarà molto più veloce di fare molte domande. –

+2

Li sto leggendo anche io, ma non sapere nulla di python rende le cose più difficili. Trovo la sua sintassi molto criptica. –

+0

Se le liste sono ordinate, si potrebbe voler controllare il modulo bisect . –

risposta

59

Le sequenze hanno un metodo index(value) che restituisce l'indice della prima occorrenza - nel tuo caso questo sarebbe verts.index(value).

È possibile eseguirlo su verts[::-1] per trovare l'ultimo indice. Ecco, questo sarebbe len(verts) - 1 - verts[::-1].index(value)

+0

Grazie, come si esegue lista [:: - 1]? verts [:: - 1]? –

+0

sì, ho modificato la risposta – SilentGhost

+2

Btw verts [:: - 1] annulla semplicemente la lista, giusto? Quindi devo compensare l'indice, giusto? –

14

Usa i1 = yourlist.index(yourvalue) e i2 = yourlist.rindex(yourvalue).

+13

_strings_ Python hanno 'rindex', ma gli elenchi no. –

+0

Siamo spiacenti, hai ragione. Ho dimenticato che le liste non hanno rindex. Devi invertire la lista. –

+9

Vero, ma 'rindex' è quello che molti lettori stanno cercando ... –

11

se siete alla ricerca per l'indice dell'ultimo occorrenza di MyValue in mylist:

len(mylist) - mylist[::-1].index(myvalue) - 1 
7

Come una piccola funzione di supporto:

def rindex(mylist, myvalue): 
    return len(mylist) - mylist[::-1].index(myvalue) - 1 
2

Questo metodo può essere più ottimizzato di oltre

def rindex(iterable, value): 
    try: 
     return len(iterable) - next(i for i, val in enumerate(reversed(iterable)) if val == value) - 1 
    except StopIteration: 
     raise ValueError 
+1

"Ottimizzato" nel senso di essere più efficiente in termini di spazio, ma è circa il 50% più lento. – dubiousjim