Python中使用for循环的二维网格

Python中使用for循环的二维网格,python,arrays,Python,Arrays,我想用python中的for循环创建一个2D网格。我可以编写如下简单代码: cols = 10 rows = 10 grid = [[0 for x in range(cols)] for y in range(rows)] print(grid) cols = 10 rows = 10 grid = [[0 for x in range(cols)] for y in range(rows)] for i in range(rows): for j in range(cols):

我想用python中的for循环创建一个2D网格。我可以编写如下简单代码:

cols = 10
rows = 10
grid = [[0 for x in range(cols)] for y in range(rows)]
print(grid)
cols = 10
rows = 10
grid = [[0 for x in range(cols)] for y in range(rows)]

for i in range(rows):
    for j in range(cols):
        grid[i].append([j])
但当我尝试在行中循环I,然后在列中循环j时,会显示错误:列表索引超出范围。不确定我的编码哪里出了问题

rows = 10
cols = 10
i = 0
for i in range(rows):
    for j in range(cols):
        grid[i].append([j])
        i += 1

您的问题在于内部循环的增量:

for i in range(rows):
    for j in range(cols):
        grid[i].append([j])
        i += 1          # BAD!!
内环增加
i
10倍,使其超出范围。摆脱那句话,你可能会得到你想要的。考虑到这种奇怪的编程风格,我不太确定您的构造应该做什么。如果没有多余的增量,您会将单个元素列表附加到原始的十个零:

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]], 
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, [0], [1], [2], [3], [4], [5], [6], [7], [8], [9]]]
您希望元素仅为0-9吗?为此:

grid = [list(range(10)) for _ in range(10)]

[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]

您将递增
i
两次。 对于范围(行)中的i,第一次使用
,第二次使用
i+=1
。 删除第二条语句,使其如下所示:

cols = 10
rows = 10
grid = [[0 for x in range(cols)] for y in range(rows)]
print(grid)
cols = 10
rows = 10
grid = [[0 for x in range(cols)] for y in range(rows)]

for i in range(rows):
    for j in range(cols):
        grid[i].append([j])
而不是:

for i in range(rows):
    for j in range(cols):
        grid[i].append([j])
        i += 1
当然,这个变量初始化也是不必要的:
i=0


如果您想找到另一种方法:

grid = [[0 for x in range(cols)] for y in range(rows)]
您还必须使用嵌套数组初始化数组:

grid = []
for i in range(rows):
    grid.append([])
    for j in range(cols):
        grid[i].append(0)
有几个问题:

  • 在循环之前,您不会实例化一个空的
    网格
    列表
  • 在尝试附加到那些子列表之前,必须将子列表附加到外部列表
  • 范围内迭代时,不需要增加计数器
  • 因此,这将起作用:

    rows = 5
    cols = 5
    
    grid = []
    for i in range(rows):
        grid.append([])
        for j in range(cols):
            grid[i].append(0)
    
    print(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]]
    

    在使用类似于
    grid[i].append()的内容之前,需要创建一个空的子列表。因为最初列表中没有任何内容,而您引用了一些不可用的内容。因此,你的错误是:(

    您可以在每个外部迭代中创建一个子列表,并将
    0
    附加到内部迭代中的前一个子列表中:

    cols = 10
    rows = 10
    
    grid = []
    for _ in range(rows):
        grid.append([])
        for _ in range(cols):
            grid[-1].append(0)
    
    print(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],
    #  [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], [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], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]我尝试使用for循环获得与第一个循环相同的结果。为什么要尝试将更多列表附加到
    grid
    的子列表中?为什么要在内部循环中递增
    I
    ?如果要重新创建第一个代码的输出,则可以从定义为空列表的网格开始。当获得解析时注意,请记住投票选出有用的东西并接受你最喜欢的答案(即使你必须自己写),因此堆栈溢出可以正确地存档问题。这已经足够好了。我只需要一个基于文本的游戏板。数字不重要。谢谢!谢谢,非常有用!这很酷!但我不确定我是否理解u如何工作?以及为什么行从-1开始?@user10381476,
    \uu
    就像一个一次性变量。你不需要Iterator,所以一个
    \uu
    就足够了。
    -1
    将获得列表的最后一个子列表,以便您可以附加到最后一个子列表。