使用列表理解和扩展
Using list comprehension and extend
我有这个
rows = self.rows()
aaa = []
for r in range(0, 9, 3):
bbb = []
for c in range(0, 9, 3):
ccc = []
for s in range(3):
ccc.extend(rows[r+s][c:c+3])
bbb.append(ccc)
aaa.append(bbb)
它returns这个
[
[
[5, 0, 0, 0, 6, 0, 0, 2, 9],
[3, 8, 0, 4, 9, 2, 0, 0, 6],
[0, 6, 2, 1, 0, 0, 3, 0, 4]
],
[
[0, 7, 6, 0, 0, 8, 0, 4, 0],
[0, 4, 0, 2, 0, 5, 0, 3, 1],
[0, 3, 1, 0, 4, 9, 0, 0, 0]
],
[
[4, 0, 0, 6, 0, 3, 0, 0, 1],
[0, 0, 0, 7, 0, 0, 0, 0, 0],
[0, 5, 3, 2, 0, 8, 0, 0, 6]
]
]
这是正确的。
rows
只是一个包含 9 个其他嵌套列表的列表,每个列表正好有 9 个整数,范围从 0 到 9。
当我尝试使用列表理解时
[[rows[r+s][c:c+3] for s in range(3) for c in range(0, 9, 3)] for r in range(0, 9, 3)]
我明白了
[
[
[5, 0, 0],
[3, 8, 0],
[0, 6, 2],
[0, 6, 0],
[4, 9, 2],
[1, 0, 0],
[0, 2, 9],
[0, 0, 6],
[3, 0, 4]
],
[
[0, 7, 6],
[0, 4, 0],
[0, 3, 1],
[0, 0, 8],
[2, 0, 5],
[0, 4, 9],
[0, 4, 0],
[0, 3, 1],
[0, 0, 0]
],
[
[4, 0, 0],
[0, 0, 0],
[0, 5, 3],
[6, 0, 3],
[7, 0, 0],
[2, 0, 8],
[0, 0, 1],
[0, 0, 0],
[0, 0, 6]
]
]
很明显我做错了什么,但我看不到什么?我已经检查了其他 SO 问题,它们暗示以某种方式构建 LC 以阻止最内层的列表分裂成 9 个单独的列表,但到目前为止,它没有发生。
你可以这样做,
print([[rows[r+s][c:c+3] * 3 for c in range(0, 9, 3)] for r in range(0, 9, 3)])
尝试:
import itertools
[[list(itertools.chain(*[rows[r+s][c:c+3] for s in range(3)])) for c in range(0, 9, 3)] for r in range(0, 9, 3)]
这会给你想要的。此版本使用没有库的裸 Python,但似乎是最简洁的(有效的解决方案):
[[[rows[r+s][c+i] for s in range(3) for i in range(3)] for c in range(0, 9, 3)] for r in range(0, 9, 3)]
格式更易读,这只是:
[[[rows[r+s][c+i] for s in range(3)
for i in range(3)]
for c in range(0, 9, 3)]
for r in range(0, 9, 3)]
这用内部 i
循环替换了原始循环嵌套中的切片,消除了连接中间切片(或生成它们)的需要。
我有这个
rows = self.rows()
aaa = []
for r in range(0, 9, 3):
bbb = []
for c in range(0, 9, 3):
ccc = []
for s in range(3):
ccc.extend(rows[r+s][c:c+3])
bbb.append(ccc)
aaa.append(bbb)
它returns这个
[
[
[5, 0, 0, 0, 6, 0, 0, 2, 9],
[3, 8, 0, 4, 9, 2, 0, 0, 6],
[0, 6, 2, 1, 0, 0, 3, 0, 4]
],
[
[0, 7, 6, 0, 0, 8, 0, 4, 0],
[0, 4, 0, 2, 0, 5, 0, 3, 1],
[0, 3, 1, 0, 4, 9, 0, 0, 0]
],
[
[4, 0, 0, 6, 0, 3, 0, 0, 1],
[0, 0, 0, 7, 0, 0, 0, 0, 0],
[0, 5, 3, 2, 0, 8, 0, 0, 6]
]
]
这是正确的。
rows
只是一个包含 9 个其他嵌套列表的列表,每个列表正好有 9 个整数,范围从 0 到 9。
当我尝试使用列表理解时
[[rows[r+s][c:c+3] for s in range(3) for c in range(0, 9, 3)] for r in range(0, 9, 3)]
我明白了
[
[
[5, 0, 0],
[3, 8, 0],
[0, 6, 2],
[0, 6, 0],
[4, 9, 2],
[1, 0, 0],
[0, 2, 9],
[0, 0, 6],
[3, 0, 4]
],
[
[0, 7, 6],
[0, 4, 0],
[0, 3, 1],
[0, 0, 8],
[2, 0, 5],
[0, 4, 9],
[0, 4, 0],
[0, 3, 1],
[0, 0, 0]
],
[
[4, 0, 0],
[0, 0, 0],
[0, 5, 3],
[6, 0, 3],
[7, 0, 0],
[2, 0, 8],
[0, 0, 1],
[0, 0, 0],
[0, 0, 6]
]
]
很明显我做错了什么,但我看不到什么?我已经检查了其他 SO 问题,它们暗示以某种方式构建 LC 以阻止最内层的列表分裂成 9 个单独的列表,但到目前为止,它没有发生。
你可以这样做,
print([[rows[r+s][c:c+3] * 3 for c in range(0, 9, 3)] for r in range(0, 9, 3)])
尝试:
import itertools
[[list(itertools.chain(*[rows[r+s][c:c+3] for s in range(3)])) for c in range(0, 9, 3)] for r in range(0, 9, 3)]
这会给你想要的。此版本使用没有库的裸 Python,但似乎是最简洁的(有效的解决方案):
[[[rows[r+s][c+i] for s in range(3) for i in range(3)] for c in range(0, 9, 3)] for r in range(0, 9, 3)]
格式更易读,这只是:
[[[rows[r+s][c+i] for s in range(3)
for i in range(3)]
for c in range(0, 9, 3)]
for r in range(0, 9, 3)]
这用内部 i
循环替换了原始循环嵌套中的切片,消除了连接中间切片(或生成它们)的需要。