首页 > 解决方案 > 列表列表和插入

问题描述

matrix1是列表的列表。matrix1[i][5]我的代码检查是否matrix1[i+1][5]包含连续数字。如果是,则可以,如果不在 i+1 中插入一个新列表,则从以前的处理中插入一个新列表并将其matrix1[i+1][5]值增加 1。这是我心中的想法,但在现实世界中的代码不起作用。如果我的代码应该在第一个matrix1[i][5]=1matrix1[i+1]=4之前添加 2 个列表matrix1[i+1]并更改数字,所以最后我没有在 1 和 4 之间打洞,但所有连续的数字和结果应该是 1 2 3 4。但是我的代码结果是3 3 3 4.. 谁能帮帮我?

for i in range(0, len(matrix1)-1):
    if int(matrix1[i][5])==int(matrix1[i+1][5])-1:
        continue
    else:
        matrix1.insert(i+1, matrix1[i])
        matrix1[i+1][5]=int(matrix1[i][5])+1

标签: pythonlistinsert

解决方案


我看到两个问题:

  1. 当您有一个列表a = [0, 1]并说b = a; b[0] = 100; print(a[0])时,您仍然会得到100. 为什么?因为在 Python 中将列表分配给变量不会复制该列表!相反,它使新变量引用与旧变量相同的内存,因此修改一个变量会修改所有变量。这是您在这里犯的错误:matrix1.insert(i+1, matrix1[i]). 您可以通过多种方式创建副本。我将使用列表理解来迭代列表就像这样:b = [x for x in a]

  2. 在迭代列表的 for 循环中修改列表(插入/删除项目)是一个坏主意。相反,最好创建一个包含您关心的所有值的新列表。

假设你有一个matrix1这样的:

matrix1 = [[0, 1, 2, 3, 4, 1],
           [0, 1, 2, 3, 4, 4],
           [0, 1, 2, 3, 4, 5],
           [0, 1, 2, 3, 4, 10],
           [0, 1, 2, 3, 4, 11]]

现在让我们定义另一个列表matrix2,它现在是空的

matrix2 = []

现在我们要将每一行复制到新矩阵中。如果matrix1[i][5]matrix1[i + 1][5]不连续,我们还将把所有必要的新行插入到新矩阵中。

for i in range(0, len(matrix1)-1):
    row = matrix1[i]
    matrix2.append([x for x in row])
    if int(matrix1[i][5])==int(matrix1[i+1][5])-1:
        continue
    else:
        # Add rows from [i][5] + 1 to less than [i + 1][5]
        # The third argument handles the case when [i + 1][5] is less than [i][5]
        for j in range(matrix[i][5] + 1, matrix1[i + 1][5], (1 if matrix1[i + 1][5] > matrix[i][5] else -1)):
            newrow = [x for x in row]
            newrow[5] = j # Set col 6
            matrix2.append(newrow) # Add another row
# Finally, append the last row
matrix2.append([x for x in matrix1[-1]])

print(matrix2)

这给出了输出:

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

或者,一种更直接的方法:我们可以简单地摆脱对连续性的检查而只使用for j循环,因此我们根据需要插入尽可能多的行来将我们从matrix1[i][5]matrix1[i + 1][5]。如果它们是连续的,我们最终将只插入一行。

for i in range(0, len(matrix1)-1):
    row = matrix1[i]
    # In this case, we also want to add the [i][5] row.
    # Add rows from [i][5] to less than [i + 1][5]
    for j in range(matrix1[i][5], matrix1[i + 1][5], (1 if matrix1[i + 1][5] > matrix1[i][5] else -1)):
        newrow = [x for x in row]
        newrow[5] = j # Set col 6
        matrix2.append(newrow) # Add another row
# Finally, append the last row
matrix2.append([x for x in matrix1[-1]])

推荐阅读