【问题标题】:Python create empty 2-dimensional arrayPython创建空的二维数组
【发布时间】:2020-04-03 08:36:22
【问题描述】:

我正在尝试使用 to 循环生成一个空的二维数组。我找到了一种可行的方法,它看起来像这样:

rows = 5
cols = 5
grid1 = []
grid1 = [[0 for i in range(cols)] for j in range(rows)] 
print(grid1)

输出:

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

但是,当我尝试以“正常”语法编写 for 循环时,它会引发错误。为什么我不能用正常的语法写?

rows = 5
cols = 5

grid2 = []
for i in range(rows):
    for j in range(cols):
        grid2[i][j] = 0
print(grid2)

输出:

Exception has occurred: IndexError
list index out of range
  File "C:\Users\Bruker\Downloads\test.py", line 8, in <module>
    grid2[i][j] = 0

【问题讨论】:

  • 您不能分配给列表中超出列表当前长度的索引。编写列表理解的等效方法是使用append

标签: python arrays multidimensional-array


【解决方案1】:

你应该初始化 grid2=np.empty([rows, cols]) 请参考https://docs.scipy.org/doc/numpy/reference/generated/numpy.empty.html#numpy.empty 了解更多

【讨论】:

  • 如果使用numpy,为什么不使用np.zeros?这似乎更符合 OP 想要做的事情。
  • 既然你想用零填充你的数组,那么用零(np.zeros)初始化它更有意义,否则如果你以后想用非零值填充它,空声明会更快
【解决方案2】:

您会得到IndexError,因为您无法分配给列表中超出列表当前长度的索引。由于grid2 被初始化为一个空列表,因此任何对其进行索引的尝试都会引发此错误。

使用 for 循环编写嵌套列表理解的一种正确方法是首先为每一行构造内部列表,然后 append this 到 grid2

grid2 = []
for i in range(rows):
    inner = []
    for j in range(cols):
        inner.append(0)
    grid2.append(inner)

【讨论】:

    【解决方案3】:

    在第一种情况下每个单元格都存在,所以你可以通过索引访问它们,但在第二种情况下它们仍然不存在,另一种方式是

    grid2 = []
    for i in range(rows):
        tmp = []
        for j in range(cols):
            tmp.append(0)
        grid2.append(tmp)
    

    事实上,如果您在获得以下内容后减少此代码,并再次使用另一个列表理解进行减少,您就有了您的第一个代码

    grid2 = []
    for i in range(rows):
        grid2.append([0 for j in range(cols)])
    

    【讨论】:

      【解决方案4】:

      您正在尝试访问第二个“维度”或内部循环而不在这里创建,您可以使用:

      rows = 5
      cols = 5
      
      grid2 = []
      for _ in range(rows):
          grid2.append([])
          for _ in range(cols):
              grid2[-1].append(0)
      print(grid2)
      

      或者你可以使用:

      grid2 = []
      for _ in range(rows):
          grid2.append([0] * cols)
      

      【讨论】:

        【解决方案5】:

        您需要使用.append() 函数将元素添加到列表中。

        grid2 = []
        for i in range(rows):
            grid2.append([])
            for j in range(cols):
                grid2[i].append(0)
        print(grid2)
        

        更高效:

        grid2 = [[0]*cols] * rows
        

        【讨论】:

          【解决方案6】:

          试试这个:

          rows = 5
          cols = 5
          
          arr = [[0 for x in range(cols)] for x in range(rows)]
          

          输出:

          [[0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0]]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-04-21
            • 2023-01-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多