【问题标题】:Initializing 2D array in Python在 Python 中初始化二维数组
【发布时间】:2012-04-14 19:12:21
【问题描述】:

我在 python 中初始化二维数组时遇到问题。我想要一个 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的数组,效率会很低吗?

更新

我还可以初始化二维数组的字典吗?我有一本像这样的字典:

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

我想像下面这样初始化一个字典:

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

【问题讨论】:

    标签: python list python-3.x


    【解决方案1】:

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

    没有涉及的是为什么[[None]*6]*6 的行为很奇怪。

    答案是[None]*6 创建了一个包含六个Nones 的列表(如您所料),但[list]*6 并没有制作list 的六个独立副本 - 它制作了六个引用 相同 list

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我想存储数据以用于 matplotlib(3D 曲面图)
      • 在这种情况下,我肯定会推荐 numpy。如果您想查看示例,则在this example 中使用它。节省自己的工作;这是一个很棒的包。
      • 所以我需要的那行就是lineData = np.empty((dims, length))?
      • 我也可以用类似的方式初始化二维数组的字典(也许你的答案中的那个)?我更新了我原来的问题
      【解决方案3】:
      arr = [[None for i in range(6)] for j in range(6)]
      
      arr[1][2] = 10
      
      arr
      

      【讨论】:

      • 欢迎来到 StackOverflow。请使用提供的格式化程序正确格式化您的代码。另外,请记住对您的代码进行一些解释或对其进行评论,以便向其他用户正确解释您的代码。
      猜你喜欢
      • 1970-01-01
      • 2012-11-29
      • 2012-12-01
      • 2012-05-20
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多