2016-07-03 105 views
-6

我想遍歷一個m -by- n「棋盤」,即所有其他元素的每一個黑色的正方形,遍歷一個「棋盤」

l = [] 
for i in range(m): 
    for j in range(n): 
     if (i+j) % 2 == 0: 
      l.append(something(i, j)) 

我使用的是顯式循環在這裏,但速度寧願使用列表理解。

任何提示?

對於獎勵積分,該解決方案也適用於i,j,k(i+j+k) % 2 == 0

+1

如果你想處理任意數量的軸,查看'itertools.product',但請注意*「任何想法?」*不是一個好的SO問題。 – jonrsharpe

回答

2

好,列表理解就像你嵌套for循環,不同之處在於,這是內做列表括號:

my_list = [something(i, j) for i in range(m) for j in range(n) if (i + j) % 2 == 0] 

更一般地,對於n嵌套循環,你可以使用itertools.product,這樣:

from itertools import product 

my_list = [something(*p) for p in product(range(n), repeat=n) if sum(p) % 2 == 0] 
0

據我所知,你想在'棋盤'上的黑色方塊的x和y座標顯式表達,所以你不要必須評估每個正方形的布爾值。這是我的解決方案的實現(2維板):

import numpy as np 

# 'Chess board' dimension 
m = 3  # Number of columns 
n = 4  # Number of rows 

# Counter variable. The length of this array is equal to the total number of black squares. 
k = np.arange(0,m*n,2) 

x_coords = (k + (k/n) % 2) % n  # x-coordinates of black squares 
y_coords = (k + (k/n) % 2)/n  # y-coordinates of black squares 

print("x-coordinates: "+str(x_coords)) 
print("y-coordinates: "+str(y_coords)) 

對於在上面的例子3×4維板,這會產生以下輸出:

x-coordinates: [0 2 1 3 0 2] 
y-coordinates: [0 0 1 1 2 2] 

其可以驗證通過繪製一個小圖。請注意,'幫助變量'(k/n) % 2會記錄行號是偶數還是奇數;奇數行相對於偶數行具有「偏移量」。