【问题标题】:Index error when creating 3d list in Python在 Python 中创建 3d 列表时出现索引错误
【发布时间】:2017-06-13 01:37:55
【问题描述】:

我正在尝试创建 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

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

【问题讨论】:

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


    【解决方案1】:

    您需要使用grid[row][column] 而不是grid[column][row]

    请注意,您不能这样做[[[[]]*10]*10]*10,因为它会创建别名,并且当修改一个列表时,它们都会被修改。

    【讨论】:

    • -1 虽然您对 OP 错误的解释是正确的,但您的解决方案是错误的。执行grid = [[[[]]*10]*10]*10 不会在grid 中创建新列表。相反,它只会为grid 中的相同列表对象创建新的引用。因此,您不能将网格位置设置为唯一值。有关该主题的更多信息,请参阅here
    • @ChristianDean 说了什么。试试grid = [[[[]]*4]*4]*4; grid[1][1][1].append(1); print(grid)
    【解决方案2】:

    在您的示例中,当 column 在最后一行等于 1(并且 row 仍为 0)时

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

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

    我们可以把最后一行改成

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

    对于这个任务我们也可以使用list comprehensionlike

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

    为什么不建议@rassar?因为它会复制相同的lists,这不是我想的你想要的(更多在这个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,它是关于多维数组的

    【讨论】:

    • 虽然您可以使用嵌套列表推导式,但在这种情况下,简单地使用常规 for 循环是更好的选择。使用它们并没有真正获得太多收益,只是增加了视觉噪音。
    【解决方案3】:

    正如 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]
    

    但是,像这样完全初始化列表可能更常见。相反,只需创建一个基本列表并根据需要扩展它。如果您确实需要适当的多维数组,请考虑使用 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 循环方法。

    【讨论】:

    • 对多维数组使用 Numpy 有什么好处?我可以将 Python 对象存储在 Numpy 数组中吗?
    • @Kos 最大的优势之一是速度。 NumPy 数组是用 C 实现的,比普通的 Python 数组快得多。然而,一个缺点是数组中的所有数据都必须是同质的。
    • @Kos:是的,您可以从lists/tuples 创建NumPy 数组
    • @Kos 是的,您可以将 Python 对象存储在 Numpy 数组中,但它们旨在存储本机机器数字类型(例如各种大小的有符号和无符号整数以及浮点数)点数),Numpy 可以在其上以编译代码的速度运行。但在你进入 Numpy 之前,最好掌握核心 Python 的基础知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2019-09-28
    • 2021-12-10
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多