迭代"棋盘的每个黑色方块"

时间:2016-07-03 16:21:22

标签: python loops

我希望迭代m的所有其他元素 - by - n"棋盘",即

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

我在这里使用了一个显式循环,但速度宁愿使用列表理解。

任何提示?

对于奖励积分,该解决方案也适用于ijk (i+j+k) % 2 == 0

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

根据我的理解,你想要一个明确的表达式,用于棋盘上的黑色方块的x和y坐标,这样你就不必评估布尔值了每个广场。这是我的解决方案的实现(对于二维板):

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

对于上例中的3x4维板,会生成以下输出:

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

您可以通过绘制一个小图来验证。请注意'帮助变量' (k/n) % 2跟踪行号是偶数还是奇数;奇数行有一个'偏移'就偶数而言。