在Python中创建3d列表时出现索引错误

时间:2017-06-13 01:37:56

标签: python arrays list python-3.x multidimensional-array

我试图创建一个3d列表,但一直收到错误。这是我的代码:

grid = []
for row in range(10):
    grid.append([])
    for column in range(10):
        grid[row].append([])
        for height in range(10):
            grid[column][row].append([])

这是我得到的错误:

Traceback (most recent call last):
  File "/Users/kosay.jabre/Desktop/3dgrid.py", line 7, in <module>
    grid[column][row].append([])
IndexError: list index out of range

我没有看到我的错误,你能帮忙吗?

3 个答案:

答案 0 :(得分:3)

您需要grid[row][column]代替grid[column][row]

请注意,您无法执行[[[[]]*10]*10]*10,因为它会创建别名,并且当修改一个列表时,它们都会被修改。

答案 1 :(得分:2)

在最后一行column等于1(且row仍然为0)的示例中

grid[column][row].append([])

grid中没有可以使用grid[1]获取的元素,这会导致错误。

我们可以将最后一行更改为

grid[row][column].append([])

对于此任务,我们也可以使用list comprehension之类的

grid = [[[[]
          for height in range(10)]
         for column in range(10)]
        for row in range(10)]

为什么不给@rassar建议?因为它会复制相同的list并且它不是我想要的(更多在此thread中):

>>>grid = [[[[]
          for height in range(10)]
         for column in range(10)]
        for row in range(10)]
>>>grid2 = [[[[]] * 10] * 10] * 10
>>>grid[0][0][0].append(1)
>>>grid2[0][0][0].append(1)
>>>grid
 [[[[1], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []]],
  [[[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []]],
  [[[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []]],
  [[[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []]],
  [[[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []]],
  [[[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []]],
  [[[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []]],
  [[[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []]],
  [[[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []]],
  [[[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []], [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []],
   [[], [], [], [], [], [], [], [], [], []]]]
>>>grid2
[[[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]],
 [[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]],
 [[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]],
 [[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]],
 [[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]],
 [[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]],
 [[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]],
 [[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]],
 [[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]],
 [[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]],
  [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]]]

最后你应该看看NumPy,这是关于多维数组的

答案 2 :(得分:2)

正如rassar所提到的,你得到了索引错误,因为你改变了索引。您应该grid[row][column]代替grid[column][row]

这是在Python中制作常规“多维”列表的标准方法。

def show(g):
    for block in g:
        for row in block:
            print(row)
        print()
    print()

grid = []
for z in range(3):
    block = []
    for y in range(4):
        row = [0] * 5
        block.append(row)
    grid.append(block)

show(grid)

for z in range(3):
    for y in range(4):
        for x in range(5):
            n = 100 * z + 10 * y + x + 111
            grid[z][y][x] = n

show(grid)

<强>输出

[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]
[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]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]


[111, 112, 113, 114, 115]
[121, 122, 123, 124, 125]
[131, 132, 133, 134, 135]
[141, 142, 143, 144, 145]

[211, 212, 213, 214, 215]
[221, 222, 223, 224, 225]
[231, 232, 233, 234, 235]
[241, 242, 243, 244, 245]

[311, 312, 313, 314, 315]
[321, 322, 323, 324, 325]
[331, 332, 333, 334, 335]
[341, 342, 343, 344, 345]

然而,完全初始化这样的列表可能更常见 not 。相反,只需创建一个基本列表并根据需要进行扩展。如果你确实需要一个合适的多维数组,可以考虑使用Numpy。

顺便说一下,有可能将这些for循环压缩成嵌套列表理解:

grid = [[[0] * 5 for y in range(4)] for z in range(3)]

它肯定比以前的代码更紧凑,但速度稍快,但可读性稍差。

为了提高可读性,我们可以将其分散到几行

grid = [
    [[0] * 5 for y in range(4)] 
        for z in range(3)
]

但它仍然相当密集,在你对Python非常熟悉之前,我建议使用我之前使用的传统for循环方法。