在Python中初始化2D数组

u7up0aaq  于 2023-01-14  发布在  Python
关注(0)|答案(4)|浏览(154)

我在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]]

注意我只设置了一个条目,并且它在所有行上都是"复制的"。有什么问题吗?我认为这与它引用了同一个列表有关,但是我该如何解决这个问题呢?
我想

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数组,这将是非常低效的?

    • 更新**

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

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

我想初始化一个字典如下:

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

mm9b1k5b1#

@卡梅隆建议你使用NumPy来处理数值数据数组是正确的。对于你问题的第二部分,~Niklas B.建议使用defaultdict是正确的。
没有讨论的是 * 为什么 * [[None]*6]*6行为奇怪。
答案是[None]*6创建了一个包含6个None的列表(正如您所期望的),但是[list]*6并没有创建list的6个独立副本--它创建了对同一个list的6个引用副本。

  • Idiomatic Python* 有一节可以更好地解释这一点:“其他语言有变量- Python有名称”。
vuktfyat

vuktfyat2#

使用列表解析,你可以说:

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

然后arr[1][2] = 10就可以正常工作了。不过,这并不是一件很正常的事情。你打算用嵌套列表做什么呢?可能有更好的方法。例如,使用numpy包可以更容易地处理数组。

y53ybaqx

y53ybaqx3#

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

arr[1][2] = 10

arr
w8f9ii69

w8f9ii694#

你可以尝试用零初始化一个数组,然后把值推到相应的索引中。

black_array = np.zeros((10,10))

返回维数为10*10且带零的black_array

相关问题