Я хочу определить двумерный массив без инициализированной длины следующим образом:
Matrix = [][]
Но это выдает ошибку:
IndexError: индекс списка выходит за пределы диапазона
Переведено автоматически
Ответ 1
Технически вы пытаетесь проиндексировать неинициализированный массив. Вы должны сначала инициализировать внешний список списками, прежде чем добавлять элементы; Python называет это "пониманием списка".
# Creates a list containing 5 lists, each of 8 items, all set to 0 w, h = 8, 5 Matrix = [[0for x inrange(w)] for y inrange(h)]
Обратите внимание, что матрица имеет основной адрес "y", другими словами, "индекс y" предшествует "индексу x".
print Matrix[0][0] # prints 1 x, y = 0, 6 print Matrix[x][y] # prints 3; be careful with indexing!
Хотя вы можете называть их как хотите, я смотрю на это так, чтобы избежать некоторой путаницы, которая может возникнуть при индексации, если вы используете "x" как для внутреннего, так и для внешнего списков и хотите получить неквадратичную матрицу.
Ответ 2
Если вам действительно нужна матрица, возможно, вам лучше использовать numpy. Матричные операции в numpy чаще всего используют тип массива с двумя измерениями. Существует множество способов создания нового массива; одним из наиболее полезных является zeros функция, которая принимает параметр shape и возвращает массив заданной формы со значениями, инициализированными нулем:
Вот несколько других способов создания двумерных массивов и матриц (с удалением выходных данных для компактности):
numpy.arange(25).reshape((5, 5)) # create a 1-d range and reshape numpy.array(range(25)).reshape((5, 5)) # pass a Python range and reshape numpy.array([5] * 25).reshape((5, 5)) # pass a Python list and reshape numpy.empty((5, 5)) # allocate, but don't initialize numpy.ones((5, 5)) # initialize with ones
numpy также предоставляет matrix тип, но он больше не рекомендуется для любого использования и может быть удален из numpy в будущем.
Ответ 3
Вот более краткое обозначение для инициализации списка списков:
matrix = [[0]*5for i inrange(5)]
К сожалению, сокращение этого до чего-то вроде 5*[5*[0]] на самом деле не работает, потому что в итоге вы получаете 5 копий одного и того же списка, поэтому, когда вы изменяете один из них, все они меняются, например: