Прежде всего, то, что вы описываете, на самом деле является трехмерной матрицей, поскольку каждая «ячейка» также имеет измерение, элемент kth
столбца jth
которого в строке ith
может быть доступен через matrix[i][j][k]
.
Независимо от того, если вы хотите предварительно выделить матрицу 2X2 для каждой ячейки, инициализированной в пустом списке, эта функция сделает это за вас:
def alloc_matrix2d(W, H):
""" Pre-allocate a 2D matrix of empty lists. """
return [ [ [] for i in range(W) ] for j in range(H) ]
Однако вы можете подумать, что это не работает, потому что я заметил, что вы сказали, что хотели бы иметь матрицу 2X2, подобную этой:
[
[
['A','B'], ['C']
],
[
['d'], ['e','f','f']
]
]
и сможете использовать «традиционные операции с матричным доступом» для этого:
(Matrix[2][2]).extend('d')
Проблема в том, что он не будет работать даже для показанной матрицы и не будет работать для одного, предварительно выделенного для 2X2, так как размеры строки и столбца находятся вне диапазона в любом случае. В Python все последовательности индексируются с нуля, поэтому допустимыми индексами для матрицы с двумя строками из двух элементов являются [0][0]
, [0][1]
, [1][0]
и [1][1]
(игнорируя возможные отрицательные индексы, которые имеют особое значение в Python). Таким образом, использование Matrix[2][2]
является попыткой получить доступ к третьему столбцу третьей строки матрицы, которая не существует и не будет даже в предварительно выделенном с размерами 2X2 ,
Все было бы хорошо, если бы вы изменили этот оператор на что-то вроде этого, используя одну из допустимых пар значений индекса (и без лишних скобок):
Matrix[1][1].extend('d')
, поскольку не поднимает IndexError
и вместо этого приводит к матрице 2X2:
[
[
['A', 'B'], ['C']
],
[
['d'], ['e', 'f', 'f', 'd']
]
]
Бонусная утилита
Вы не просили об этом, но вот удобная функция, которую я написал, чтобы помочь распечатать произвольные по размеру двумерные матрицы любого типа (представленные как вложенные lists
):
def repr_matrix2d(name, matrix):
lines = ['{} = ['.format(name)]
rows = []
for row in range(len(matrix)):
itemreprs = [repr(matrix[row][col]) for col in range(len(matrix[row]))]
rows.append('\n [\n {}\n ]'.format(', '.join(itemreprs)))
lines.append('{}\n]'.format(','.join(rows)))
return ''.join(lines)
Надеюсь, это поможет.