python - 列表列表和插入
问题描述
matrix1
是列表的列表。matrix1[i][5]
我的代码检查是否matrix1[i+1][5]
包含连续数字。如果是,则可以,如果不在 i+1 中插入一个新列表,则从以前的处理中插入一个新列表并将其matrix1[i+1][5]
值增加 1。这是我心中的想法,但在现实世界中的代码不起作用。如果我的代码应该在第一个matrix1[i][5]=1
和matrix1[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
解决方案
我看到两个问题:
当您有一个列表
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]
在迭代列表的 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]])
推荐阅读
- scala - 如何在 Spark Scala 中更新 DataFrame 的多列
- php - 不需要额外参数时如何在控制器中使用更新功能?
- bash - 将参数传递给 VirtualBox MacOS 终端
- python - python合并返回ValueError:无法将DataFrame与类型的实例合并
- javascript - 使用 JS linter/formatter 将条件(else/if)运算符转换为逻辑运算符(&& ||)?
- python - Tkinter,如何根据复选框状态设置某些元素的状态
- php - 如何将 php 代码与 html 分开,并且代码仍然可以正常工作!并在选择菜单上方打印 $selection 错误变量
- react-native - React Native 错误:无法解析 node_modules/react-native 中的模块`./index`
- maven - 如何配置 maven 在模块反应器失败之前检查多个模块
- c - 在 C 中使用管道,是的 | 头部进入无限循环