2015-04-17 15 views
6

Mam listę listPython Siła Lista Index poza zasięgiem Exception

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

Chcę kod rzucać tablicy Out of Bounds wyjątek podobny do tego, jak się robi w Javie, gdy indeks jest poza zakresem . Na przykład,

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 

Jeśli jest wyjątek, chcę wrócić 0.

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

myślę zasadzie w każdej chwili indeks jest ujemny, wyjątek.

+3

Liczba -1 nie jest jednak niepoprawnym indeksem dla listy. Po prostu zwraca ostatni element ... Dlaczego miałoby to wynikać z błędu? – Ben

+2

Indeksowanie negatywne jest obsługiwane w języku Python. – letsc

+5

Ujemne indeksy mają szczególny, bardzo użyteczny cel w Pythonie: indeksowanie od końca 'listy' (lub' str', lub co masz). Chęć wyeliminowania tego zachowania prawdopodobnie oznacza, że ​​powinieneś wrócić i przemyśleć ponownie swoją logikę programu. – TigerhawkT3

Odpowiedz

15

Można tworzyć własne listy klas, dziedziczenie domyślnym i wdrożenie metody __getitem__, która zwraca element w określonym indeksie:

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

Przykład:

>>> 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: 
    ... 

To ostatecznie podniesie błąd indeksu, ponieważ len (any_list) jest zawsze +1 od ostatniego ważnego indeksu. Btw. dobrze jest tylko uchwycić spodziewane wyjątki (te, które chcesz obsłużyć); twój kod złapie każdy wyjątek.

Dobrze, po prostu przeczytaj komentarz. Twoje pierwotne pytanie brzmiało tak, jakbyś chciał sprowokować błąd indeksu.

1

Istnieje lepszy sposób na obsługę przypadków na granicy: wystarczy zwiększyć tablicę o dwa w obu wymiarach i wypełnić całą ramkę wartością domyślną (na przykład 0) i nigdy ich nie aktualizować. W przypadku sąsiedztwa i aktualizacji wystarczy przeszukać wewnętrzne pole (indeks 1 .. (len-2)), zamiast 0..len-1. Indeksy nigdy nie będą poza zasięgiem wyszukiwania w sąsiedztwie. Eliminuje to potrzebę specjalnego traktowania. (Robiłem to wiele lat temu w tym samym użyciu, ale w innym języku - Pascal, iirc.)

Powiązane problemy