替换列表中的索引

时间:2016-02-15 19:02:37

标签: python list replace

我有一个包含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具有与当前矩阵的索引相同的值时才应进行替换。

2 个答案:

答案 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))