Как назначить значения в двухмерный список из другого? - PullRequest
0 голосов
/ 25 марта 2019

У меня есть двумерный список со значениями, которые я меняю. Их нужно сохранить в другом двумерном списке (первый список не должен изменяться).

Я пытался установить значения напрямую, но я получаю эту ошибку: IndexError: список индексов вне диапазона.

Это потому что ничего не копируется в fin_mat.

Как я могу поместить измененные значения в новый список?

for i, i_it in enumerate(mat):
     for j, j_it in enumerate(mat[i]):
       fin_mat[i][j] = mat[i-1][j] + mat[i+1][j] + mat[i][j-1] + mat[i][j+1]

UPD: Хорошо, я попытаюсь объяснить. Программа должна запросить строку и преобразовать ее в список, который был добавлен в другой, чтобы создать двумерный список:

b, st = [], [i for i in input().split()]
mat = []

может быть любым длинным, и чтобы остановить ввод, вы должны написать: "end"

while (st[0] != 'end'):
  st = [i for i in input().split()]
  b.append(st)
if (st[0] == 'end'):
  del b[-1]

Чем вы меняете строковые значения на int

for j in b:
  r = [int(item) for item in j]
  mat.append(r)
print(mat)

После этого мне нужно создать еще одну матрицу, в которой элементы должны быть определены по этой формуле:
(i-1, j) + (i+1, j) + (i, j-1) + (i, j+1) = fin_mat [i] [j]

Я не могу просто скопировать первый список и не могу изменить его, потому что значения из первого списка находятся в этой формуле.

Мне нужно добавить значения одно за другим в fin_mat

Ответы [ 3 ]

1 голос
/ 25 марта 2019

Я думаю, что проще сделать это без перечисления, как в этом примере:

import cv2
img = cv2.imread("./Screenshot.png",1)
print(img.shape) # output is (961, 1744, 3)
for i in range(len(img)):
    for j in range(len(img[i])):
        img[i][j]=5
1 голос
/ 25 марта 2019

Сначала создайте копию исходной матрицы, например:

import copy
fin_mat = copy.deepcopy(mat)
0 голосов
/ 25 марта 2019

Вокруг самого вопроса есть несколько вопросов, но, думаю, я понимаю, в чем заключается ваша проблема и вопрос.

По сути, вы не только хотите скопировать список, но и выполнить некоторые преобразования, не изменяяоригинал.

Как уже указывалось ранее, в части копирования уже есть ответы на другие вопросы.Что касается вашего IndexError, это связано с логикой циклов;в основном, когда i=0 вы пытаетесь получить доступ к mat[-1][j]

Чтобы исправить это, вам нужно добавить некоторую логику вокруг того, что происходит, когда вы находитесь на краю своей матрицы (в этом примере это 0, но вы можете свободноизменить):

fin_mat = fin_mat = [[0]*len(mat[0])]*len(mat) #creates an empty list of the same dimensions 
for i, i_it in enumerate(mat):
    for j, j_it in enumerate(mat[i]):
        left = mat[i-1][j] if i > 0 else 0
        right = mat[i+1][j] if i < len(mat)-1 else 0
        top = mat[i][j-1] if j > 0 else 0
        bottom = mat[i][j+1] if j < len(mat[i])-1 else 0
        fin_mat[i][j] = left + right + top + bottom

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...