2015-04-17 18 views
6

Ho una lista di listePython Forza List Indice di Gamma Exception

x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

Voglio che il codice per lanciare un Array Out of Bounds Eccezione simile a come si fa in Java quando l'indice è fuori portata . Ad esempio,

x[0][0] # 1 
x[0][1] # 2 
x[0-1][0-1] # <--- this returns 9 but I want it to throw an exception 
x[0-1][1] # <--- this returns 7 but again I want it to throw an exception 
x[0][2]  # this throws an index out of range exception, as it should 

Se viene generata un'eccezione, voglio che ritorni 0.

try: 
    x[0-1][0-1] # I want this to throw an exception 
except: 
    print 0  # prints the integer 0 

Credo che fondamentalmente in qualsiasi momento l'indice è negativo, un'eccezione.

+3

Il numero -1 non è un indice non valido per un elenco, però. Restituisce solo l'ultimo elemento ... Quindi perché lo fa attraverso un errore? – Ben

+2

L'indicizzazione negativa è supportata in Python. – letsc

+5

Gli indici negativi hanno uno scopo particolare, molto utile in Python: indicizzazione dalla fine di un 'list' (o' str', o cosa avete). Voler eliminare questo comportamento probabilmente significa che dovresti tornare indietro e ripensare alla logica del tuo programma. – TigerhawkT3

risposta

15

È possibile creare la propria classe lista, ereditando quella di default, e l'attuazione del metodo __getitem__ che restituisce l'elemento in un indice specificato:

class MyList(list): 
    def __getitem__(self, index): 
     if index < 0: 
      raise IndexError("list index out of range") 
     return super(MyList, self).__getitem__(index) 

Esempio:

>>> l = MyList([1, 2, 3]) 
>>> l[-1] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 4, in __getitem__ 
IndexError: list index out of range 
>>> l[0] 
1 
>>> l[3] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 5, in __getitem__ 
IndexError: list index out of range 
0
try: 
    x[len(x)][0] 
except IndexError: 
    ... 

Questo alla fine aumenterà un errore di indice, dato che len (any_list) è sempre +1 dopo l'ultimo indice valido. Btw. è consigliabile consigliare solo di rilevare le eccezioni previste (quelle che in realtà si desidera gestire); il tuo codice catturerà qualsiasi eccezione.

Ok, basta leggere il tuo commento. La tua domanda originale suonava come se volessi provocare un errore di indice.

1

C'è un modo migliore per gestire i casi di confine: basta aumentare l'array di due in entrambe le dimensioni e riempire tutti i bordi con un valore predefinito (ad esempio 0) e non aggiornarli mai. Per il vicinato e l'aggiornamento, cerca solo il campo interno (indice 1 .. (len-2)), invece di 0..len-1. Quindi, gli indici non saranno mai fuori limite per la ricerca del quartiere. Ciò elimina la necessità di un trattamento speciale. (L'ho fatto molti anni fa per lo stesso uso, ma in una lingua diversa - Pascal, iirc.)