首页 > 解决方案 > 如何在 Python 中操作嵌套列表?

问题描述

我有一个类似下一个的矩阵,但更大:

m = [[38, 38,  0],
     [39, 38,  0],
     [40, 38,  0],
     [41, 38,  3],
     [42, 38,  0],
     [43, 38,  4],
     [44, 38,  4],
     [45, 38,  5],
     [38, 39,  0],
     [39, 39,  0],
     [40, 39,  0],
     [41, 39,  3],
     [42, 39,  0],
     [43, 39,  4],
     [44, 39,  4],
     [45, 39,  5],
     [38, 40,  0],
     [39, 40,  0],
     [40, 40,  0],
     [41, 40,  3],
     [42, 40,  0],
     [43, 40,  4],
     [44, 40,  4],
     [45, 40,  5]]

我想在循环中更改前两列的值,使它们从 1 开始。

结果将是以下矩阵:

[[1, 1,  0],
 [2, 1,  0],
 [3, 1,  0],
 [4, 1,  3],
 [5, 1,  0],
 [6, 1,  4],
 [7, 1,  4],
 [8, 1,  5],
 [1, 2,  0],
 [2, 2,  0],
 [3, 2,  0],
 [4, 2,  3],
 [5, 2,  0],
 [6, 2,  4],
 [7, 2,  4],
 [8, 2,  5],
 [1, 3,  0],
 [2, 3,  0],
 [3, 3,  0],
 [4, 3,  3],
 [5, 3,  0],
 [6, 3,  4],
 [7, 3,  4],
 [8, 3,  5]]

我很感激详细的解释,因为我是 python 新手。:)

标签: pythonmatrix

解决方案


假设

我将在下面回答,但 StackOverflow 的一个好做法是展示您已经尝试过的内容以及您遇到的问题。另外,Python 目前有两个主要版本:2.7 和 3。我不知道您使用的是哪一个,所以我将使用 Python 3 中的示例。主要版本没有太大差异,所以有一个很好的这些示例有可能在两个版本中都有效。

正如@MK Patel 在评论中所说,我们不确定您的矩阵是每行有三个元素,还是只有一个(格式错误)。我将假设您的意思是[1, 1, 0]而不是[1. 1. 0.].

答案和例子

首先,假设您的矩阵以 m 为单位:m =[[38, 38, 0.], ...]

循环遍历所有行的最简单方法是:

for row in m:
    # do stuff with row
    print(row[1]) # print second column

这种方法的问题是您必须自己计算自己的行数(例如,每个循环都可以增加一个变量“rowCount”)。

为了让 Python 在这里为您完成工作,您可以在矩阵的长度上迭代一个整数。这样做是这样的:

for i in range(len(m)):
    # your row is now in m[i]
    print(m[i][1]) # print second column

在这里,len(m)等于数组的长度。range(n)是包含 [0, 1..., n] 的列表的简写。这样,您可以设置行的第一列(索引 0)以匹配行数,因此该列从 1 开始,并与您的循环一起上升。请记住,Python(和大多数其他编程语言)将从 0 开始计数,因此您每次都必须加 1。

由于您想为第二列中的每个新值“重新开始”计数,您可以使用模 ( %) 运算符让 i 在每次上升 8 时从 1 重新开始。这是基于我对您的第二列。在下一段中阅读更多内容。

for i in range(len(m)):
    # set first column to i + 1, to start counting from 1 and go up every time
    m[i][0] = (i % 8) + 1

对于您的第二个专栏,我也遗漏了一些信息。有几种方法可以解决您的问题,具体取决于始终正确的情况。最值得注意的是每个数字重复 8 次,所以我将在代码中使用这个事实。

我们可以使用整数除法运算符 ( //) 为迭代器 ( i) 上升的每 8 加一个。

for i in range(len(m)):
    # set first column to i + 1, to start counting from 1 and go up every time
    m[i][0] = (i % 8) + 1
    # set the second column to (i // 8) + 1, going up one every 8 rows (and start at one)
    m[i][1] = (i // 8) + 1

我希望这会有所帮助。


推荐阅读