2015-04-17 10 views
6

Ich habe eine Liste von ListenPython Force-Liste-Index außerhalb Bereichs Exception

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

ich den Code möge ähnliches ein Array Out of Bounds Exception werfen, wie sie tut in Java, wenn der Index außerhalb des zulässigen Bereichs . Zum Beispiel

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 

Wenn eine Ausnahme ausgelöst wird, will ich es 0.

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

Ich denke, im Grunde jederzeit der Index negativ zurückzukehren ist, eine Ausnahme werfen.

+3

Die Zahl -1 ist kein ungültiger Index für eine Liste, obwohl. Es gibt nur das letzte Element zurück ... Warum also durch einen Fehler? – Ben

+2

Negative Indizierung wird in Python unterstützt. – letsc

+5

Negative Indizes haben einen besonderen, sehr nützlichen Zweck in Python: Indizierung vom Ende einer 'liste' (oder' str', oder was hast du). Dieses Verhalten zu eliminieren bedeutet wahrscheinlich, dass Sie zurückgehen und die Logik Ihres Programms überdenken sollten. – TigerhawkT3

Antwort

15

Sie können Ihre eigene Liste Klasse, erben die Standard ein, und die Umsetzung der __getitem__ Methode erstellen, die das Element in einem angegebenen Index zurückgibt:

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

Beispiel:

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

Dies führt schließlich zu einem Indexfehler, da len (any_list) immer +1 nach dem letzten gültigen Index ist. BTW. Es empfiehlt sich, nur die erwarteten Ausnahmen abzufangen (die, die Sie eigentlich behandeln möchten); Ihr Code fängt jede Ausnahme ab.

Ok, lesen Sie einfach Ihren Kommentar. Ihre ursprüngliche Frage klang so, als ob Sie einen Indexfehler provozieren wollten.

1

Es gibt eine bessere Möglichkeit, die Grenzfälle zu behandeln: Erhöhen Sie einfach das Array um zwei in beiden Dimensionen und füllen Sie alle Rahmen mit einem Standard (z. B. 0) und aktualisieren Sie sie nie. Suchen Sie für Nachbarschaft und Aktualisierung nur das innere Feld (Index 1 .. (len-2)) statt 0.len-1. Daher sind die Indizes für die Nachbarschaftssuche niemals außerhalb der Grenzen. Dies beseitigt die Notwendigkeit einer speziellen Behandlung. (Ich tat dies vor vielen Jahren für die gleiche Verwendung, aber in einer anderen Sprache - Pascal, iirc.)

Verwandte Themen