我有一个二维列表,其中包含我要更改的值。它们需要保存在另一个二维列表中(第一个列表不应更改)。
我尝试直接设置值,但出现此错误: 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
中一一添加值
答案 0 :(得分:1)
首先创建原始矩阵的副本,如下所示:
import copy
fin_mat = copy.deepcopy(mat)
答案 1 :(得分:1)
我认为不枚举像下面的示例那样更容易做到
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
答案 2 :(得分:0)
围绕问题本身存在一些问题,但我想我理解您所遇到的问题是什么。
从本质上讲,您不仅要复制列表,而且还需要进行一些转换而不更改原始列表。
如前所述,复制部分已经在其他问题中得到解答。关于您的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
希望这会有所帮助