2009-03-16 17 views
7

Ho una lista di numeri interi. Voglio sapere se appare il numero 13 e, in tal caso, dove. Devo cercare l'elenco due volte, come nel codice qui sotto?Gli elenchi Python hanno un equivalente a dict.get?

if 13 in intList: 
    i = intList.index(13) 

Nel caso di dizionari, c'è una funzione get che accertare l'appartenenza ed eseguire look-up con la stessa ricerca. C'è qualcosa di simile per le liste?

risposta

12

Hai risposto da solo, con il metodo index(). Che sarà un'eccezione se l'indice non si trova, quindi basta prendere che:

def getIndexOrMinusOne(a, x): 
    try: 
    return a.index(x) 
    except ValueError: 
    return -1 
+0

Non utilizzare mai una clausola eccedente. Dovresti fare eccetto IndexError. –

+0

che non funzionerebbe. [] .index() genera un errore Value – SingleNegationElimination

+0

Probabilmente stai violando le liste se devi fare le cose in questo modo; questo sembra un odore di codice. –

7

Sembra che dovrete solo per intercettare l'eccezione ...

try: 
    i = intList.index(13) 
except ValueError: 
    i = some_default_value 
-1

Basta mettere quello che entrare in una funzione e usarlo :)

È possibile utilizzare if i in list: return list.index(i) o try/except, in base alle proprie preferenze.

3

No, non esiste una corrispondenza diretta per ciò che è stato chiesto. C'era a discussion a while back sulla mailing list di Python su questo, e la gente è arrivata alla conclusione che probabilmente era un odore di codice se ne avevi avuto bisogno. Considerare l'utilizzo di dic o impostare invece se è necessario verificare l'appartenenza in questo modo.

+0

Penso che tu non abbia letto attentamente la domanda. – vartec

+0

Ah, whoops; hai ragione. Fisso! –

+0

Questo condensa solo la sintassi dell'esempio di codice originale. Il problema delle prestazioni non è affrontato. Python verifica ancora se prima l'elemento in elenco, quindi cerca l'indice dell'elemento nell'elenco. –

2

È possibile intercettare l'eccezione ValueError, o si può fare:

i = intList.index(13) if 13 in intList else -1 

(Python 2.5+)

BTW. se hai intenzione di fare un grande gruppo di operazioni simili, potresti prendere in considerazione la costruzione di un valore di dizionario inverso -> indice.

intList = [13,1,2,3,13,5,13] 
indexDict = defaultdict(list) 
for value, index in zip(intList, range(len(intList))): 
    indexDict[value].append(index) 

indexDict[13] 
[0, 4, 6] 
Problemi correlati