2015-04-18 16 views
17

sembra come seCome posso verificare se esiste un indice di lista?

if not mylist[1]: 
    return False 

non funziona.

+0

'mylist [1]' restituirà l'elemento in corrispondenza dell'indice 1. Dire che questo elemento è il valore 'false', come è possibile prendere in considerazione? – alfasin

+0

Sì, il mio codice è terribile. Quello che ho cercato di fare sembra un modo molto nonpolitico di farlo se ha funzionato. – Sundrah

+0

Da dove prendi il valore '1'? –

risposta

24

Devi solo per controllare se l'indice si desidera è nell'intervallo di 0 e la lunghezza della lista, come questo

if 0 <= index < len(list): 

realtà è internall y valutata come

if (0 <= index) and (index < len(list)): 

Quindi, che i controlli condizione se l'indice è compreso nell'intervallo [0, lunghezza della lista).

Nota: Python supporta l'indicizzazione negativa. Citando pitone documentation,

Se i o j è negativo, l'indice è relativo alla fine della stringa: len(s) + i o len(s) + j viene sostituito. Ma nota che -0 è ancora 0.

Significa che ogni volta che si utilizza l'indicizzazione negativa, il valore verrà aggiunto alla lunghezza dell'elenco e il risultato verrà utilizzato. Quindi, list[-1] ti darebbe l'elemento list[-1 + len(list)].

Quindi, se si desidera consentire indici negativi, allora si può semplicemente controllare se l'indice non superi la lunghezza della lista, come questo

if index < len(list): 

Un altro modo per farlo è , ad eccezione IndexError, come questo

a = [] 
try: 
    a[0] 
except IndexError: 
    return False 
return True 

Quando si tenta di accedere a un elemento a un indice non valido, un IndexError viene sollevata. Quindi, questo metodo funziona.


Nota: Il metodo lei ha citato nella questione ha un problema.

if not mylist[1]: 

Diciamo 1 è un indice valido per mylist, e se si restituisce un Falsy value. Quindi not lo annullerà in modo che la condizione if venga valutata come Truthy. Quindi, restituirà False, anche se un elemento effettivamente presente nell'elenco.

+0

Se l'indice negativo è troppo basso si otterrà un 'IndexError' per essere fuori dal range, quindi si potrebbe voler controllare 'index> = -len (list)' se lo si sta supportando. –

+0

Un altro svantaggio del primo metodo è che Python consente indici non sequenziali tramite .insert –

2

Nel caso di liste di interi indicizzati, avrei semplicemente fare

if 1 < len(mylist): 
    ... 

Per dicts, si può ovviamente fare

if key in mydict: 
    ... 
4

Nello stile EAFP di Python:

try: 
    mylist[1] 
except IndexError: 
    print "Index doesn't exist!" 
Problemi correlati