Объединение двух массивов в один в Python путем динамического распределения c - PullRequest
1 голос
/ 16 марта 2020

У меня есть два массива, list_string & list_string2. Их значения назначаются и заполняются статически (в редакторе)

list_string = ["1", "12", "15", "21", "131"]

#DEFINING THE ROW AND COLUMN VALUE FOR RESULTANT ARRAY
rows,coln = (5,5)

#INITIALIZING THE RESULTANT ARRAY
arr = [[0]for i in range(rows) for j in range(coln)]

list_string2 = ["1","2","3","4","5"]

#ITERATING THROUGH EACH OF THE LISTS FOR FILLING
for i in range(len(list_string)):
     for j in range(len(list_string2)):
         arr[i][j] = [list_string[i]] [list_string2[j]]) 

Я немного читал, видел другие потоки при определении, инициализации 2D-массивов, но все они создают новые массивы и статически назначают значения. Я пытаюсь динамически назначить значения, но код ошибки, я получаю

Traceback (последний вызов последнего): файл "C: ...... intro2.py ", строка 12, в arr.append ([list_string [i]] [list_2 [j]]) TypeError: списочные индексы должны быть целыми или кусочками, а не str

Индексами i & j являются используются определенно целые числа, так как они проходят через метод диапазона. Может кто-нибудь объяснить, почему это происходит.

РЕДАКТИРОВАТЬ 2:

Ожидаемый результат:

[[" 1 "" 1 "" 12 "" 15 "" 21 "" 131 "]

[" 2 "" 1 "" 12 "" 15 "" 21 "" 131 "]

["3" "1" "12" "15" ........ "131"]

["4" "1" ............ .......... "131"]

["5" ......................... " 131 "]

Изменения кода:

Я обнаружил некоторые ошибки индекса за пределами границ и изменил код следующим образом (ошибка все еще сохраняется)

    list_string = ["1", "12", "15", "21", "131"]

#DEFINING THE ROW AND COLUMN VALUE FOR RESULTANT ARRAY
rows,coln = (5,6)
arr = [[0 for i in range(coln)] for j in range(rows)]

print(arr)

list_string2 = ["1","2","3","4","5"]

#ITERATING THROUGH EACH OF THE LISTS FOR FILLING
for i in range(len(list_string)):
     for j in range(len(list_string2)):
         arr[i][j] = [list_string[i]][list_string2[j]]


print (arr)

1 Ответ

1 голос
/ 16 марта 2020

Ответ:

Если я правильно понял, вам не нужны переменные rows, coln, поскольку петли зависят от размеров list_string и list_string2

arr = [list_string[:] for _ in range(len(list_string2))]
for i, l in enumerate(arr): 
   l.insert(0, list_string2[i]) 

Это даст ожидаемый результат:

>>> print(arr)
[['1', '1', '12', '15', '21', '131'],
 ['2', '1', '12', '15', '21', '131'],
 ['3', '1', '12', '15', '21', '131'],
 ['4', '1', '12', '15', '21', '131'],
 ['5', '1', '12', '15', '21', '131']]

Прежде всего, здесь есть дополнительная скобка

arr[i][j] = [list_string[i]] [list_string2[j]])
                                              ^

Чтобы объяснить ошибку, она приходит отсюда

arr[i][j] = [list_string[i]] [list_string2[j]]

[list_string[i]] возвращает новый список с элементом из list_string. Для i=0 это ["1"]. Для [list_string2[j]] это ["1"] для j=0

Когда вы ставите квадратные скобки после списка, синтаксически для доступа к элементу списка. Таким образом, последняя строка вашего кода эквивалентна приведенному ниже

lstr = ["1"]            # [list_string[0]]
arr[i][j] = lstr["1"]   # [list_string[0]] [list_string2[0]]

Вы пытаетесь получить доступ к элементу "1" списка, который не имеет смысла. Вот почему вы получаете TypeError: list indices must be integers or slices, not str

...