Voglio definire un array bidimensionale senza una lunghezza inizializzata come questo:
Matrix = [][]
ma non funziona...
Ho provato il codice qui sotto, ma anche questo è sbagliato:
Matrix = [5][5]
Errore:
Traceback ...
IndexError: list index out of range
Qual è il mio errore?
Tecnicamente stai cercando di indicizzare un array non inizializzato. Devi prima inizializzare la lista esterna con le liste prima di aggiungere elementi; Python chiama questo "comprensione della lista".
# 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
Notate che la matrice è "y" indirizzo maggiore, in altre parole, il "indice y" viene prima del "indice x".
print Matrix[0][0] # prints 1
x, y = 0, 6
print Matrix[x][y] # prints 3; be careful with indexing!
Anche se potete chiamarli come volete, io la vedo in questo modo per evitare qualche confusione che potrebbe sorgere con l'indicizzazione, se usate "x" sia per la lista interna che per quella esterna, e volete una Matrice non quadrata.
Dovreste fare una lista di liste, e il modo migliore è quello di usare le comprensioni annidate:
>>> 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]]
Nel tuo esempio [5][5]
, stai creando una lista con un intero "5" all'interno, e cerchi di accedere al suo quinto elemento, e questo naturalmente solleva un IndexError perché non c'è un quinto elemento:
>>> l = [5]
>>> l[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range