Chcem definovať dvojrozmerné pole bez inicializovanej dĺžky takto:
Matrix = [][]
ale nefunguje to...
Skúsil som nižšie uvedený kód, ale aj ten je nesprávny:
Matrix = [5][5]
Error:
Traceback ...
IndexError: list index out of range
V čom je moja chyba?
Technicky sa snažíte indexovať neinicializované pole. Pred pridaním položiek musíte najprv inicializovať vonkajší zoznam so zoznamami; Python to nazýva "porozumenie zoznamu".
# 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
Všimnite si, že matica má "y" hlavnú adresu, inými slovami, "y index" je pred "x indexom".
print Matrix[0][0] # prints 1
x, y = 0, 6
print Matrix[x][y] # prints 3; be careful with indexing!
Hoci ich môžete pomenovať, ako chcete, ja sa na to pozerám takto, aby som sa vyhol určitým zmätkom, ktoré by mohli vzniknúť pri indexovaní, ak použijete "x" pre vnútorný aj vonkajší zoznam a chcete neštvorcovú maticu.
Mali by ste vytvoriť zoznam zoznamov a najlepším spôsobom je použiť vnorené comprehensions:
>>> 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]]
Na vašom príklade [5][5]
vytvárate zoznam s celým číslom "5" vo vnútri a pokúšate sa pristupovať k jeho piatej položke, čo prirodzene vyvoláva chybu IndexError, pretože žiadna piata položka neexistuje:
>>> l = [5]
>>> l[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range