我有一个包含n个相同3x3矩阵的列表,其中n是一个这样的矩阵中的零个数。
在我的第一个矩阵中,我想用整数2替换第一个0。 在第二个矩阵中,我想用2替换第二个0。 这一直持续到第n个矩阵,我想用2替换n:th 0。每个矩阵只应该替换一个索引。
到目前为止我的代码:
def replaceZero(x):
# Omitted code where I count number of 0 in x
n = 9 # in this example
# Creating a list which holds n matrices
lists = []
for i in range(0,n):
lists.append(x)
# Replacing the i:th 0 with 2
for i in range(0,n):
m = -1
for j in range(0,3):
for k in range(0,3):
if lists[i][j][k] == 0:
m = m + 1
if m == i:
lists[i][j][k] = 2
return lists
# Example of a matrix
x = [[0,0,0],[0,0,0],[0,0,0]]
我无法弄清楚为什么它不起作用。虽然,更换了太多的零,并且每个矩阵的替换都是相同的。
每次找到零时,我都会尝试将m
增加1。只有当m
具有与当前矩阵的索引相同的值时才应进行替换。
答案 0 :(得分:1)
当前的问题是,您使用对 x 的九个引用来构建列表。您没有 x 的九个副本;您有九个对相同 x 的引用。如果您更改了一个,则将其全部更改。
相反,改变这种技术:
import copy
...
lists.append(copy.deepcopy(x))
完整文档为here。由于您具有多级结构,因此需要使用 deepcopy ;如果你只使用复制,那么你将得到9个指向相同三个零向量的矩阵。
这会让你感动吗?
很高兴能得到帮助。您还可以简化内部循环:
for i in range(0,n):
j = i / 3
k = i % 3
lists[i][j][k] = 2
答案 1 :(得分:1)
您需要做的就是使用按值复制而不是通过引用来附加矩阵。这可以使用copy.deepcopy
完成:
import copy
并替换:
lists.append(x)
与
lists.append(copy.deepcopy(x))