使用嵌套for循环

时间:2017-09-26 15:25:58

标签: python

我正在使用普通的python来制作棋盘格,而不是交替的1和0。我知道我可以使用带有模数运算符的嵌套for循环,但我不知道如何处理for循环中的模数。

def print_board(board):
    for i in range(len(board)):

        print " ".join([str(x) for x in board[i]])



    my_grid = []

    for i in range(8):
        my_grid.append([0] * 8)
        for j in range(8):
            #This is where I'm stuck.


print_board(my_grid)

5 个答案:

答案 0 :(得分:2)

也许我们首先应该解决另一个问题:如何使用棋盘格式生成列表

这样的列表因此交错了[0,1,0,...]行和[1,0,1,...]行。

让我们首先构造长度为n的第一行。我们可以这样做:

[i%2 for i in range(n)]

现在下一行应该是:

[(i+1)%2 for i in range(n)]

下一个可以是:

[(i+2)%2 for i in range(n)]

你看到一种模式出现了吗?我们可以构建如下模式:

[[(i+j)%2 for i in range(n)] for j in range(m)]

现在唯一剩下的就是将其作为字符串生成。我们可以通过将列表中的数据转换为strjoin它们(并且可选地使用生成器而不是列表解析)来实现此目的。所以:

'\n'.join(''.join(str((i+j)%2) for i in range(n)) for j in range(m))

因此我们可以构建一个 m×n 网格,如:

def print_board(m,n):
    print('\n'.join(''.join(str((i+j)%2) for i in range(n)) for j in range(m)))

然后是10x15板:

>>> print_board(10,15)
010101010101010
101010101010101
010101010101010
101010101010101
010101010101010
101010101010101
010101010101010
101010101010101
010101010101010
101010101010101

N.B。:我们可以使用&1代替%2来提高代码效率:

def print_board(m,n):
    print('\n'.join(''.join(str((i+j)&1) for i in range(n)) for j in range(m)))

答案 1 :(得分:2)

一种简单的方法

# Function to draw checkerboard
def drawBoard(length):

    for row in xrange(0, length):
        for col in xrange(0, length):

            # Even rows will start with a 0 (No offset)
            # Odd rows will start with a 1 (1 offset)
            offset = 0
            if row % 2 == 0:
                offset = 1

            # alterate each column in a row by 1 and 0
            if (col + offset) % 2 == 0:
                print '1',
            else:
                print '0',

        # print new line at the end of a row
        print ""


drawBoard(8)

答案 2 :(得分:2)

这是我的解决方案,使用嵌套for循环。请注意,i+j是偶数还是奇数是确定它应该在哪里以及它应该在0的好方法,因为它总是在相邻的'单元'之间交替。

def checkerboard(n):
    board = []
    for i in range(n):
        board.append([])
        for j in range(n):
            board[i].append((i+j) % 2)
    return board

for row in checkerboard(8):
    print(row)

打印

[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]

答案 3 :(得分:1)

对于偶数宽度,你可以避免所有循环,只需乘以一些字符串:

def print_board(width):
    print ('0 1 ' * (width // 2) + '\n' + '1 0 ' * (width // 2) + '\n') * (width // 2)

print_board(10)

,并提供:

0 1 0 1 0 1 0 1 0 1 
1 0 1 0 1 0 1 0 1 0 
0 1 0 1 0 1 0 1 0 1 
1 0 1 0 1 0 1 0 1 0 
0 1 0 1 0 1 0 1 0 1 
1 0 1 0 1 0 1 0 1 0 
0 1 0 1 0 1 0 1 0 1 
1 0 1 0 1 0 1 0 1 0 
0 1 0 1 0 1 0 1 0 1 
1 0 1 0 1 0 1 0 1 0

对于10 x 10网格,其工作原理如下:

  1. 取字符串
    1 0

  2. 将字符串乘以5给出 1 0 1 0 1 0 1 0 1 0

  3. 0 1给予同样的信息:
    0 1 0 1 0 1 0 1 0 1

  4. 在每个结尾处添加换行符并将它们连接在一起:
    1 0 1 0 1 0 1 0 1 0 \n0 1 0 1 0 1 0 1 0 1 \n

  5. 现在将整个字符串乘以5得到网格。

答案 4 :(得分:0)

您可以使用列表推导和模数:

new_board = [[0 if b%2 == 0 else 1 for b in range(8)] if i%2 == 0 else [1 if b%2 == 0 else 0 for b in range(8)] for i in range(8)]
for row in new_board:
   print(row)

输出:

[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]

获得更多自定义结束:

for row in new_board:
   print(' '.join(map(str, row)))

输出:

0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0