2017-09-26 124 views
2

我只使用普通的python製作了一個棋盤網格,交替出現了1s和0s。我知道我可以使用模運算符嵌套for循環,但我不知道如何處理for循環中的模數。用1s和0s繪製一個棋盤用嵌套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) 

回答

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

因此,我們可以構建一個米×Ñ網格狀:

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

甲10×15板然後是:

>>> 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))) 
+0

我已經將其投入使用,但我不確定是否正確使用它。我用了一個for循環來追加網格,然後我使用(i + j)%2,但它根本不影響它。 –

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 
+3

嵌套列表理解往往會傷害可讀性超過他們幫助提高性能。你真的*需要*全部在一行嗎? – trentcl

+0

@trentcl我發現對於更小,更簡單的問題,列表理解效果最好,因爲它更短,更簡潔。 – Ajax1234

+3

如果i%2 == 0,你告訴我'[[如果b%2 == 0 else 1 for b in range(8)] else else [1 if b%2 == 0 else 0 for b in range (8)]爲我在範圍(8)]'是「短而簡潔」? *聳聳肩*我想你自己來吧。 – trentcl

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) 
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×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這整串,以獲得電網。

2

這是我的解決方案,使用嵌套for循環。請注意,i+j是偶數還是奇數是確定位置1和位置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]