串列推導式(List Comprehension)
# 一行就可以寫出一整個二維結構,可讀、可控、又超有成就感。
# 🔍 來幫你拆解這行到底在幹嘛:
matrix = [[j - i for j in range(cols)] for i in range(rows)]
# 你可以這樣看它的邏輯順序(從裡到外):
# ✅ 外層:for i in range(rows)
# → 我們要跑出每一列(row)
# ✅ 內層:for j in range(cols)
# → 在每一列中跑每一欄(column)
# ✅ 實際計算:j - i
# → 每一格的內容就是「欄索引 j」減去「列索引 i」
# 🧠 實際運作範例
# 假設 rows = 2,cols = 3
matrix = [
[0 - 0, 1 - 0, 2 - 0], # i = 0
[0 - 1, 1 - 1, 2 - 1] # i = 1
]
# 最後變成:
[
[0, 1, 2],
[-1, 0, 1]
]
# ✅ 方法 1:用計數器依序放入 0~8(3x3)
fruit = []
count = 0
for i in range(3):
row = []
for j in range(3):
row.append(count)
count += 1
fruit.append(row)
print(fruit)
# 🟩 結果:
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
# ✅ 方法 2:用串列推導式 + range
fruit = [[i * 3 + j for j in range(3)] for i in range(3)]
# 🧠 解釋:
# i 代表第幾列(row)
# j 是第幾欄(col)
# i*3 + j 就是從 0 開始編號填格子
# 結果也是:
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
# ✅ 方法 3:把 range(9) 切割成 3 列
data = list(range(9)) # [0~8]
fruit = [data[i:i+3] for i in range(0, 9, 3)]
# 這個方法適合「先有一組值,再切成多列」的狀況。
# 🔹 第一步:建立一維資料
data = list(range(9))
# 這會建立一個一維串列,內容是從 0 到 8(總共 9 個數字):
data = [0, 1, 2, 3, 4, 5, 6, 7, 8]
# 🔹 第二步:用切片分段
fruit = [data[i:i+3] for i in range(0, 9, 3)]
# 這句話的精髓在:
# range(0, 9, 3) ➜ 會產生 i = 0, 3, 6
# data[i:i+3] ➜ 就是把 data 每 3 個一段地切出來
# 🧠 data[i:i+3] 實際執行順序:
# i 切片 data[i:i+3] 結果
# 0 data[0:3] [0, 1, 2]
# 3 data[3:6] [3, 4, 5]
# 6 data[6:9] [6, 7, 8]
# 🔄 最後 fruit 會是:
[[0, 1, 2],
[3, 4, 5],
[6, 7, 8]]
# 🔔 小提醒:切片語法 list[a:b]
# 表示從索引 a(含)取到索引 b(不含)
list[2:5] ➜ 取第 2、3、4 項
# ✅ 延伸應用(超常見!)
# 你可以改成:
data = list(range(16)) # [0~15]
grid = [data[i:i+4] for i in range(0, 16, 4)] # 切成 4x4 格子
# 結果會是:
[
[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9,10,11],
[12,13,14,15]
]
# 這招常見於:
# 做遊戲棋盤、地圖、像素陣列
# 把 CSV 讀進來之後切成表格
# 拆一維資料成「幾行幾列」