[英]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)
它返回這個
[
[
[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 個單獨的列表,但到目前為止,這還沒有發生。
嘗試:
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
循環,從而無需連接中間切片(或生成它們)。
你可以做這樣的事情,
print([[rows[r+s][c:c+3] * 3 for c in range(0, 9, 3)] for r in range(0, 9, 3)])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.