2d массив списков в python

Я пытаюсь создать 2dматрицу, чтобы каждая ячейка содержала список строк. Матричные размеры известны до создания, и мне нужно иметь доступ к любому элементу с самого начала (без динамического заполнения матрицы). => Я думаю, что требуется какое-то предварительное распределение пространства.

Например, я хотел бы иметь матрицу 2X2:

[['A','B'] ['C']; ['d'] ['e','f','f']] 

с поддержкой традиционных операций доступа к матрицам, например

 (Matrix[2][2]).extend('d') 

или

 tmp = Matrix[2][2] tmp.extend('d') Matrix[2][2] = tmp 

для управления содержимым ячеек.

Как это сделать в python?

Так же, как вы написали:

 >>> matrix = [["str1", "str2"], ["str3"], ["str4", "str5"]] >>> matrix [['str1', 'str2'], ['str3'], ['str4', 'str5']] >>> matrix[0][1] 'str2' >>> matrix[0][1] += "someText" >>> matrix [['str1', 'str2someText'], ['str3'], ['str4', 'str5']] >>> matrix[0].extend(["str6"]) >>> matrix[0] ['str1', 'str2someText', 'str6'] 

Просто подумайте о 2D-матрице как списке списков.

 Other operations too work just fine, like >>> matrix[0].append('value') >>> matrix[0] [0, 0, 0, 0, 0, 'value'] >>> matrix[0].pop() 'value' >>> 

Вы можете сделать это с помощью основного:

 matrix = [ [["s1","s2"], ["s3"]], [["s4"], ["s5"]] ] 

или вы можете сделать это очень

 from collections import defaultdict m = defaultdict(lambda : defaultdict(list)) m[0][0].append('s1') 

В случае defaultdict у вас есть произвольная матрица, которую вы можете использовать, любой размер и все элементы являются массивами, для которых необходимо соответствующим образом управлять.

Прежде всего, то, что вы описываете, на самом деле является 3-мерной матрицей, так как каждая «ячейка» также имеет размерность, к которой к- 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 и вместо этого IndexError бы матрицу 2X2:

 [ [ ['A', 'B'], ['C'] ], [ ['d'], ['e', 'f', 'f', 'd'] ] ] 

Бонусная утилита. Вы не запрашивали ее, но вот удобная функция, которую я написал, чтобы помочь распечатать произвольные размерные 2D-матрицы любого типа (представленные в виде вложенных 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) 

Надеюсь это поможет.

Один из вариантов – написать собственный класс, где вы перегружаете оператор []. Взгляните на это здесь: http://www.penzilla.net/tutorials/python/classes/ . Признание 2d элюмента в 1d является y * rowSize + x. Расширение элементов путем записи функции append, которая будет использовать append rowSize.

Если вы хотите создать 2d-матрицу, и вам необходимо предварительно распределить ее, вы можете сделать следующее:

 x,y = 3,3 A = [ [None]*x for i in range(y) ] 

Вы можете заменить None на нужное значение. И вы можете использовать .extend для добавления дополнительных значений.

Привет, ребята, я не уверен, что это полезно или нет, но вот как я создал список 2d с python3.4 надеюсь, что это полезно

 list=[] list1=[] list2=[] list3=[] answer1='yes' answer2='yes' answer3='yes' while answer1=='yes': item1=input("Please input a list element for your first list:") answer1=input("Do you want to continue:") list1.append(item1) while answer2=='yes': item2=input("Please input a list element for your second list:") answer2=input("Do you want to continue:") list2.append(item2) while answer3=='yes': item3=input("Please input a list element for your third list:") answer3=input("Do you want to continue:") list3.append(item3) list.append(list1) list.append(list2) list.append(list3) print(list)