如何将值分配给另一个二维列表?

时间:2019-03-25 11:35:49

标签: python list

我有一个二维列表,其中包含我要更改的值。它们需要保存在另一个二维列表中(第一个列表不应更改)。

我尝试直接设置值,但出现此错误: 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 个答案:

答案 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

希望这会有所帮助