簡體   English   中英

使用列表理解和擴展

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM