Ну, немного "поздно" ...
В случае, если производительность имеет значение, а ваши данные имеют прямоугольную форму, вы также можете хранить их в одном измерении и получать доступ к столбцам с помощью регулярного среза, например. ...
A = [[1,2,3,4],[5,6,7,8]] #< assume this 4x2-matrix
B = reduce( operator.add, A ) #< get it one-dimensional
def column1d( matrix, dimX, colIdx ):
return matrix[colIdx::dimX]
def row1d( matrix, dimX, rowIdx ):
return matrix[rowIdx:rowIdx+dimX]
>>> column1d( B, 4, 1 )
[2, 6]
>>> row1d( B, 4, 1 )
[2, 3, 4, 5]
Отличная вещь - это действительно быстро. Однако , отрицательные индексы здесь не работают! Таким образом, вы не можете получить доступ к последнему столбцу или строке по индексу -1.
Если вам нужна отрицательная индексация, вы можете немного настроить функции доступа, например,
def column1d( matrix, dimX, colIdx ):
return matrix[colIdx % dimX::dimX]
def row1d( matrix, dimX, dimY, rowIdx ):
rowIdx = (rowIdx % dimY) * dimX
return matrix[rowIdx:rowIdx+dimX]