以任意顺序填写完整的列表列表

时间:2016-07-17 22:02:18

标签: python list

我正在尝试填充python中的NxN列表列表。在某种程度上,如果看作2D阵列,首先填充主对角线,然后用其他元素完成其他操作(这里不相关)。例如,如果我们在开头有dyn_arr=[[[], [], []], [[], [], []], [[], [], []]],则应首先变为:[[[1], [], []], [[], [1], []], [[], [], [1]]]。我假设这段代码可能会这样做:

dyn_arr = [[[]]* N] * N
idx_set = []
for pointer in range(N):
    pointer_pair = [0, pointer]
    while pointer_pair[0] < N and pointer_pair[1] < N:
        if pointer_pair[0] == pointer_pair[1]:
            dyn_arr[pointer_pair[0]][pointer_pair[1]]=[1]
        pointer_pair[0] += 1
        pointer_pair[1] += 1

但它输出[[[1], [1], [1]], [[1], [1], [1]], [[1], [1], [1]]]。有人可以解释一下发生了什么以及我该如何纠正它?

2 个答案:

答案 0 :(得分:1)

使用乘法运算符创建列表时要小心。这种方式会将引用与列表中的对象相乘;它不会创建副本!因此,如果使用a = [[]] * 3创建列表列表,则会创建三个元素的列表,这些元素都是相同的空数组。更改它(使用.append())将更改此外部列表的所有三个元素中引用的相同列表:

a = [[]] * 3
print a  # prints "[[], [], []]"
a[0].append(4)
print a  # prints "[[4], [4], [4]]"
print a[0] is a[1]  # prints "True"

您应该始终使用列表解析创建列表列表:

# instead of dyn_arr = [[[]]* N] * N use:
dyn_arr = [ [ [] for _i in range(N) ] for _j in range(N) ]

创建后结果看起来相同,但此版本为每个条目创建 new 数组,而不是其他引用。

这可以解决原始错误导致的问题。

答案 1 :(得分:0)

import numpy as np

N = 3
z = np.zeros((N,N))
rng = np.arange(N)
z[rng, rng] = 1
print z

我希望这会有所帮助 :)