Θέλω να ορίσω έναν δισδιάστατο πίνακα χωρίς αρχικοποιημένο μήκος ως εξής:
Matrix = [][]
αλλά δεν λειτουργεί...
Δοκίμασα τον παρακάτω κώδικα, αλλά και αυτός είναι λάθος:
Matrix = [5][5]
Σφάλμα:
Traceback ...
IndexError: list index out of range
Ποιο είναι το λάθος μου;
Τεχνικά προσπαθείτε να ευρετηριάσετε έναν μη αρχικοποιημένο πίνακα. Πρέπει πρώτα να αρχικοποιήσετε την εξωτερική λίστα με λίστες πριν προσθέσετε στοιχεία- η Python το ονομάζει αυτό "κατανόηση λίστας".
# Creates a list containing 5 lists, each of 8 items, all set to 0
w, h = 8, 5;
Matrix = [[0 for x in range(w)] for y in range(h)]
Matrix[0][0] = 1
Matrix[6][0] = 3 # error! range...
Matrix[0][6] = 3 # valid
Σημειώστε ότι ο πίνακας έχει διεύθυνση "y", με άλλα λόγια, ο δείκτης "y" έρχεται πριν από τον δείκτη "x".
print Matrix[0][0] # prints 1
x, y = 0, 6
print Matrix[x][y] # prints 3; be careful with indexing!
Αν και μπορείτε να τις ονομάσετε όπως θέλετε, το βλέπω με αυτόν τον τρόπο για να αποφύγω κάποια σύγχυση που θα μπορούσε να προκύψει με την ευρετηρίαση, αν χρησιμοποιήσετε "x" τόσο για την εσωτερική όσο και για την εξωτερική λίστα, και θέλετε έναν μη τετραγωνικό Πίνακα.
Θα πρέπει να φτιάξετε μια λίστα από λίστες και ο καλύτερος τρόπος είναι να χρησιμοποιήσετε εμφωλευμένες κατανοήσεις:
>>> matrix = [[0 for i in range(5)] for j in range(5)]
>>> pprint.pprint(matrix)
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
Στο παράδειγμά σας [5][5]
, δημιουργείτε μια λίστα με έναν ακέραιο "5" μέσα, και προσπαθείτε να προσπελάσετε το 5ο στοιχείο της, και αυτό φυσικά δημιουργεί ένα IndexError επειδή δεν υπάρχει 5ο στοιχείο:
>>> l = [5]
>>> l[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range