【问题标题】:How to assign values to a two-dimensional list from another?如何将值分配给另一个二维列表?
【发布时间】:2019-03-25 11:35:49
【问题描述】:

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

我尝试直接设置值,但出现此错误: 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中一一添加值

【问题讨论】:

  • 什么是mat?你能提供吗?
  • 问题看起来像每次迭代的列表索引;简而言之,当 1 = 0 时,您尝试访问 mat[-1][j],这显然会在您到达 j+1 时发生
  • 你应该解释你想要做的改变的逻辑。在mat[i-m+1] 中还有一个m,它没有在任何地方声明(至少不在您提供的代码中)。请提供MCVE
  • 我在看到你的更新之前添加了一个正确的答案;看看,如果它不适用,让我们知道

标签: python list


【解决方案1】:

首先创建原始矩阵的副本,如下所示:

import copy
fin_mat = copy.deepcopy(mat)

【讨论】:

    【解决方案2】:

    我认为没有像这个例子那样枚举更容易做到:

    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
    

    【讨论】:

      【解决方案3】:

      围绕问题本身有几个问题,但我想我理解你的问题和问题是什么。

      本质上,您不仅要复制列表,还要在不更改原始列表的情况下进行一些转换。

      如前所述,复制部分已在其他问题中得到解答。关于您的 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
      

      希望对你有帮助

      【讨论】:

      • 我知道,我做到了this。但是问题没有解决
      • 我不太明白逻辑,我认为在这种情况下嵌套的 if-else 对可读性没有帮助,特别是如果你将它添加到 for 循环中但它似乎是 run
      猜你喜欢
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 2023-01-13
      相关资源
      最近更新 更多