二维列表填充一整列

最后发布: 2020-07-09


问题

我想要一个能制作相邻矩阵的算法。输入的是一个1D列表,输出的是一个2D列表,上面有数字的变化。这就是我的算法。

n_clusters = 5
user = [4, 4, 4, 2, 3, 3, 0, 0, 0]  # input array

movement_counts = [[0] * n_clusters] * n_clusters  # row is from, col is to

prev_label = user[0]
for label in user[1:]:
    if label != prev_label:
        movement_counts[prev_label][label] += 1
    prev_label = label

这将返回

[[1, 0, 1, 1, 0], 
 [1, 0, 1, 1, 0],
 [1, 0, 1, 1, 0],
 [1, 0, 1, 1, 0],
 [1, 0, 1, 1, 0]]

但我想让它返回这个。

[[0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 1, 0],
 [1, 0, 0, 0, 0],
 [0, 0, 1, 0, 0]]

为什么它把整个列都填上数字 而不是只有一个元素?

python arrays list adjacency-matrix
回答

替换为:[4, 4, 4, 2, 3, 3, 0, 0, ...]。

movement_counts = [[0] * n_clusters] * n_clusters

替换为:

movement_counts = [[0] * n_clusters for _ in range(n_clusters)]

因为: movement_counts = [[0] * n_clusters] * n_clusters 生成的列表包含指向内存中相同引用的子列表,所以如果你改变任何一个子列表中的任何一个元素,改变将发生在所有的子列表中。