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

在Python中创建3d列表时出现索引错误,python,arrays,list,python-3.x,multidimensional-array,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 c

我正在尝试创建一个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
回溯(最近一次呼叫最后一次):
文件“/Users/kosay.jabre/Desktop/3dgrid.py”,第7行,在
网格[列][行].追加([])
索引器:列表索引超出范围

我看不出我的错误,你能帮忙吗?

你需要做
grid[row][column]
而不是
grid[column][row]


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

您需要执行
网格[行][列]
而不是
网格[列][行]


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

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

grid[column][row].append([])
网格中没有可以通过
网格[1]
获得的元素,这会导致错误

我们可以把最后一行改为

grid[row][column].append([])
对于此任务,我们还可以使用

为什么不考虑@rasar建议?因为它将复制相同的
列表
s,并且它不是您想要的(我想更多):


最后,在示例中,当最后一行的
等于1(且
仍然为0)时,您应该看看哪些是关于多维数组的

grid[column][row].append([])
网格中没有可以通过
网格[1]
获得的元素,这会导致错误

我们可以把最后一行改为

grid[row][column].append([])
对于此任务,我们还可以使用

为什么不考虑@rasar建议?因为它将复制相同的
列表
s,并且它不是您想要的(我想更多):


最后,您应该看一看多维数组的所有内容

,正如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
循环方法。

正如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
循环方法。

-1虽然您对OP错误的解释是正确的,但您的解决方案是错误的。执行
grid=[[[]]*10]*10
不会在
grid
中创建新列表。相反,它将只创建对
网格中相同列表对象的新引用。因此,不能将栅格位置设置为唯一值。有关该主题的更多信息,请参阅@ChristianDean所说的。尝试
grid=[[]]*4]*4;网格[1][1][1]。追加(1);打印(网格)
-1虽然您对OP错误的解释是正确的,但您的解决方案是错误的。执行
grid=[[[]]*10]*10
不会在
grid
中创建新列表。相反,它将只创建对
网格中相同列表对象的新引用。因此,不能将栅格位置设置为唯一值。有关该主题的更多信息,请参阅@ChristianDean所说的。尝试
grid=[[]]*4]*4;网格[1][1][1]。追加(1);打印(网格)
虽然您可以使用嵌套列表理解,但在本例中,只使用常规for循环是一个更好的选择。通过使用它们,您实际上并没有获得多少收益,只是增加了视觉噪音。虽然您可以使用嵌套列表理解,但在这种情况下,只使用常规for循环是更好的选择。通过使用它们,您并没有获得太多的收益,而且只会增加视觉噪音。将Numpy用于多维数组有什么好处?我可以在Numpy数组中存储Python对象吗?@Kos最大的优势之一是速度。NumPy数组是用C实现的,比普通Python数组快得多。但是,缺点是数组中的所有数据都必须是同质的。@Kos:是的,您可以从
list
s/
tuple
创建
NumPy
数组s@Kos是的,您可以将Python对象存储在Numpy数组中,但它们是为存储本机机器数字类型而设计的(例如,各种大小的带符号整数和无符号整数和浮点数),Numpy可以以编译代码的速度运行。但是在进入Numpy之前,最好掌握核心Python的基础知识。在多维中使用Numpy有什么好处