清单和插入

2024-10-01 02:26:36 发布

您现在位置:Python中文网/ 问答频道 /正文

matrix1是一个列表列表。我的代码检查matrix1[i][5]matrix1[i+1][5]是否包含连续的数字。如果是,则确定,如果不是,则在i+1应对策略中插入一个新列表,并将matrix1[i+1][5]值增加1。这是我心目中的想法,但在现实世界中,代码不起作用。如果matrix1[i][5]=1matrix1[i+1]=4我的代码应该在第一个列表之后和matrix1[i+1]之前添加2个列表,并更改编号,因此在末尾我没有在1和4之间穿洞,但所有连续的编号和结果都应该是1 2 3 4。但是用我的代码,结果是3。。有人能帮我吗

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

Tags: 代码in列表for世界range数字策略
1条回答
网友
1楼 · 发布于 2024-10-01 02:26:36

我看到两个问题:

  1. 当您有一个列表a = [0, 1]并说b = a; b[0] = 100; print(a[0])时,仍然会得到100的输出。为什么?因为在Python中将列表分配给变量不会复制该列表相反,它使新变量引用与旧变量相同的内存,因此修改一个变量会修改所有变量。这就是你在这里犯的错误:matrix1.insert(i+1, matrix1[i])。您可以通过bunch of ways创建副本。我将使用列表理解来迭代列表,只是为了检查它,就像这样: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]])

相关问题 更多 >