在Python中初始化2D数组

Jie*_*eng 8 python list python-3.x

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

arr = [[None]*6]*6
Run Code Online (Sandbox Code Playgroud)

但当我这样做时:

>>> 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]]
Run Code Online (Sandbox Code Playgroud)

注意我只设置了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)
Run Code Online (Sandbox Code Playgroud)

工作,但似乎只需要初始化一个空的6x6阵列,如果我想要10000x10000阵列,它将是非常低效的?

UPDATE

我还可以初始化二维数组的字典吗?我有一个字典,如:

algos = { "FIFO": ..., "LRU": ..., "Random": ... }
Run Code Online (Sandbox Code Playgroud)

我想初始化如下的字典:

algoData = { "FIFO": 2D arr, "LRU": 2D arr, "Random": 2D arr }
Run Code Online (Sandbox Code Playgroud)

Li-*_*Yip 17

@Cameron建议您使用NumPy处理数值数据数组是正确的.对于你的问题的第二部分,〜尼克拉斯B.有他的建议使用defaultdict.

没有涉及的是为什么 [[None]*6]*6表现得很奇怪.

答案是[None]*6创建具有六个名单None在其S(像你期望的那样),但[list]*6不进行六个独立的副本list-它使一式六份参考相同 list.

惯用Python有一个部分可以更好地解释这个:"其他语言有变量 - Python有名字".


Cam*_*ron 15

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

arr = [[None for x in range(6)] for y in range(6)]
Run Code Online (Sandbox Code Playgroud)

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

  • 在那种情况下,我肯定会推荐numpy.如果您想查看示例,则在[此示例](http://matplotlib.sourceforge.net/examples/animation/simple_3danim.html)中使用它.保存自己的工作; 这是一个很棒的包. (3认同)