在Python中初始化2D数组

时间:2012-03-31 08:04:57

标签: python list python-3.x

我在python中初始化2D数组时遇到问题。我想要一个6x6阵列,我做了

arr = [[None]*6]*6

但是当我这样做时:

>>> arr[1][2]=10
>>> arr
[[None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None]]

注意我只设置了1个项目,并在所有行上“复制”了它。怎么了?我认为这与它引用相同的列表有关,但我该如何解决这个问题呢?

我想了

for key, _ in algos.items():
    algoData[key] = []
    for i in range(0,6):
        algoData[key].append([])
        for j in range(0,6):
            algoData[key][i].append(None)

有效,但只是初始化一个空的6x6数组似乎很长,如果我想要一个10000x10000数组,它将是非常低效的?

更新

我还可以初始化2D数组的字典吗?我有一本字典:

algos = { "FIFO": ..., "LRU": ..., "Random": ... }

我想初始化如下字典:

algoData = { "FIFO": 2D arr, "LRU": 2D arr, "Random": 2D arr }

3 个答案:

答案 0 :(得分:17)

@Cameron建议您使用NumPy处理数值数据数组是正确的。对于你的问题的第二部分,~Niklas B.的建议是使用defaultdict

为什么 [[None]*6]*6表现得很奇怪。

答案是[None]*6会创建一个包含六个None的列表(如您所料),但[list]*6不会生成六个list的独立副本 - 它将引用的六个副本复制到相同的 list

惯用语有一个部分可以更好地解释这一点:"Other languages have variables - Python has names"

答案 1 :(得分:15)

使用列表推导,您可以说:

arr = [[None for x in range(6)] for y in range(6)]

然后您将arr[1][2] = 10按预期工作。然而,这不是一件很正常的事情。你打算用什么嵌套列表?可能有更好的方法。例如,使用numpy包可以更轻松地使用数组。

答案 2 :(得分:0)

arr = [[None for i in range(6)] for j in range(6)]

arr[1][2] = 10

arr