将多个列表理解组合成一个列表列表
Combining multiple list comprehensions into a list of lists
我知道有与我的标题类似的问题,但我找不到与我在下面概述的问题类似的问题:
我正在尝试将以下 9 个列表理解存储到一个列表中,以便每个列表理解本身都是新列表中的一个列表:
a = [(i,j) for i in range(3) for j in range(3)]
b = [(i,j) for i in range(3) for j in range(3,6)]
c = [(i,j) for i in range(3) for j in range(6,9)]
d = [(i,j) for i in range(3,6) for j in range(3)]
e = [(i,j) for i in range(3,6) for j in range(3,6)]
f = [(i,j) for i in range(3,6) for j in range(6,9)]
g = [(i,j) for i in range(6,9) for j in range(3)]
h = [(i,j) for i in range(6,9) for j in range(3,6)]
i = [(i,j) for i in range(6,9) for j in range(3,9)]
具体来说,这些打印出数独板中 BLOCKS 的索引。我希望将每个块作为一个列表中的列表。
谁能给我指出正确的方向。
谢谢
我可以想到两种方法,两种方法都是对您所拥有内容的微不足道的重写:
1) master_list = [a,b,c,d,e,f,g,h,i]
也就是说,只需将您获得的单独命名的列表放入列表中即可。
2)
master_list = [
[(i,j) for i in range(3) for j in range(3)],
[(i,j) for i in range(3) for j in range(3,6)],
[(i,j) for i in range(3) for j in range(6,9)],
[(i,j) for i in range(3,6) for j in range(3)],
[(i,j) for i in range(3,6) for j in range(3,6)],
[(i,j) for i in range(3,6) for j in range(6,9)],
[(i,j) for i in range(6,9) for j in range(3)],
[(i,j) for i in range(6,9) for j in range(3,6)],
[(i,j) for i in range(6,9) for j in range(3,9)],
]
本质上是一样的,只是没有中间变量名。
合理化一点,可以定义一个函数
def f(b, r):
return [(i, j) for i in range(b, b+3) for j in range(*r)]
并以所需的范围驱动它
ml = [f(b, r) for b in range(0, 9, 3) for r in ((0, 3), (3, 6), (6, 9))]
不确定你的最后一行是否正确,但很确定应该是
[(i,j) for i in range(6,9) for j in range(6,9)]
不是
[(i,j) for i in range(6,9) for j in range(3,9)]
因为这是 3x6 网格。
尽管如此,这是用于创建 9 个 3x3 网格的更清晰的列表组合:
[[(x0*3 + i, y0*3 + j) for x in range(3) for y in range(3)] for x0 in range(3) for y0 in range(3)]
我知道有与我的标题类似的问题,但我找不到与我在下面概述的问题类似的问题:
我正在尝试将以下 9 个列表理解存储到一个列表中,以便每个列表理解本身都是新列表中的一个列表:
a = [(i,j) for i in range(3) for j in range(3)]
b = [(i,j) for i in range(3) for j in range(3,6)]
c = [(i,j) for i in range(3) for j in range(6,9)]
d = [(i,j) for i in range(3,6) for j in range(3)]
e = [(i,j) for i in range(3,6) for j in range(3,6)]
f = [(i,j) for i in range(3,6) for j in range(6,9)]
g = [(i,j) for i in range(6,9) for j in range(3)]
h = [(i,j) for i in range(6,9) for j in range(3,6)]
i = [(i,j) for i in range(6,9) for j in range(3,9)]
具体来说,这些打印出数独板中 BLOCKS 的索引。我希望将每个块作为一个列表中的列表。
谁能给我指出正确的方向。
谢谢
我可以想到两种方法,两种方法都是对您所拥有内容的微不足道的重写:
1) master_list = [a,b,c,d,e,f,g,h,i]
也就是说,只需将您获得的单独命名的列表放入列表中即可。
2)
master_list = [
[(i,j) for i in range(3) for j in range(3)],
[(i,j) for i in range(3) for j in range(3,6)],
[(i,j) for i in range(3) for j in range(6,9)],
[(i,j) for i in range(3,6) for j in range(3)],
[(i,j) for i in range(3,6) for j in range(3,6)],
[(i,j) for i in range(3,6) for j in range(6,9)],
[(i,j) for i in range(6,9) for j in range(3)],
[(i,j) for i in range(6,9) for j in range(3,6)],
[(i,j) for i in range(6,9) for j in range(3,9)],
]
本质上是一样的,只是没有中间变量名。
合理化一点,可以定义一个函数
def f(b, r):
return [(i, j) for i in range(b, b+3) for j in range(*r)]
并以所需的范围驱动它
ml = [f(b, r) for b in range(0, 9, 3) for r in ((0, 3), (3, 6), (6, 9))]
不确定你的最后一行是否正确,但很确定应该是
[(i,j) for i in range(6,9) for j in range(6,9)]
不是
[(i,j) for i in range(6,9) for j in range(3,9)]
因为这是 3x6 网格。
尽管如此,这是用于创建 9 个 3x3 网格的更清晰的列表组合:
[[(x0*3 + i, y0*3 + j) for x in range(3) for y in range(3)] for x0 in range(3) for y0 in range(3)]