Python创建空的二维数组

3
我想使用两个for循环来生成一个空的二维数组。我找到了一个可行的方法,看起来像这样:
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

2
你不能将值分配给列表中超出当前长度的索引。编写列表推导式的等效方法是使用 append - dspencer
6个回答

2
您会收到 IndexError 错误,因为您无法在列表中的索引超出当前列表长度的位置进行赋值。由于 grid2 初始化为空列表,任何尝试对其进行索引的操作都会引发此错误。
使用 for 循环编写嵌套列表推导式的一种正确方式是先为每行构建内部列表,然后将其附加到 grid2 中:
grid2 = []
for i in range(rows):
    inner = []
    for j in range(cols):
        inner.append(0)
    grid2.append(inner)

2

如果使用 numpy,为什么不用 np.zeros 呢?这似乎更符合 OP 的需求。 - dspencer
既然您想用零填充数组,那么最好使用零进行初始化(np.zeros),否则如果您稍后想要用非零值填充它,则空声明更快。 - yuri

0

试试这个:

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

0
在第一种情况下,每个单元格都存在,因此您可以通过索引访问它们,但在第二种情况下,它们仍不存在,另一种方法是。
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)])

0

您正在尝试访问第二个“维度”或内部循环,但没有在此处创建,您可以使用:

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)

0
你需要使用.append()函数来向列表中添加元素。
grid2 = []
for i in range(rows):
    grid2.append([])
    for j in range(cols):
        grid2[i].append(0)
print(grid2)

更加高效地:

grid2 = [[0]*cols] * rows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接