Python List Comprehension(串列生成式)
這篇 List Comprehension 教學將帶你認識 Python 最具代表性的語法之一:用一行程式碼「從一串資料產生另一串資料」。原本要寫三四行的 for 迴圈 + append,一行就能完成,而且可讀性更好(用對的話)。
基本語法
新List = [運算式 for 元素 in 來源]
先看傳統寫法與 Comprehension 的對照——把 1~5 每個數字平方:
# 傳統寫法
squares = []
for n in range(1, 6):
squares.append(n ** 2)
print(squares)
# List Comprehension:一行完成
squares = [n ** 2 for n in range(1, 6)]
print(squares)
執行輸出:
[1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]
讀法是:「對來源中的每個 n,取 n ** 2,收集成新的 List」。
加上 if 過濾
在尾端加 if 可以過濾元素——只保留條件成立的:
nums = [3, -7, 12, -1, 9, -5]
positive = [n for n in nums if n > 0]
print(positive)
# 等同於:
# positive = []
# for n in nums:
# if n > 0:
# positive.append(n)
執行輸出:
[3, 12, 9]
if else 轉換
if else 寫在前面時是轉換(每個元素都會保留,但值不同):
scores = [85, 42, 91, 58, 76]
results = ["及格" if s >= 60 else "不及格" for s in scores]
print(results)
執行輸出:
['及格', '不及格', '及格', '不及格', '及格']
位置口訣:過濾放後面(for 之後)、轉換放前面(for 之前)。
實用範例
# 字串處理:全部轉小寫並去空白
emails = [" Alice@Test.com ", "BOB@test.COM "]
clean = [e.strip().lower() for e in emails]
print(clean)
# 搭配 dict:取出所有及格科目的名稱
scores = {"國文": 85, "英文": 52, "數學": 78}
passed = [subject for subject, s in scores.items() if s >= 60]
print(passed)
執行輸出:
['alice@test.com', 'bob@test.com']
['國文', '數學']
另外還有 Dict Comprehension 與 Set Comprehension,語法同理:
squares = {n: n ** 2 for n in range(1, 4)} # Dict Comprehension
print(squares)
執行輸出:
{1: 1, 2: 4, 3: 9}
可讀性界線
Comprehension 不是越多越好。原則:一眼看不懂就改回 for 迴圈。巢狀兩層以上、邏輯複雜的情況,傳統迴圈反而更清楚:
# 像這種就不建議——能跑,但很難讀
matrix = [[1, 2], [3, 4], [5, 6]]
flat = [x for row in matrix for x in row if x % 2 == 0]
print(flat)
執行輸出:
[2, 4, 6]
常見錯誤
1. if 的位置放錯
「只過濾」的 if 放 for 後面;「if else 轉換」放 for 前面。[n for n in nums if n > 0 else 0] 是語法錯誤。
2. 在 Comprehension 裡呼叫有副作用的程式
Comprehension 的設計用途是「產生新 List」,純粹要執行動作(如 print)請用一般 for 迴圈,不要寫 [print(x) for x in nums]。
3. 過度巢狀
兩層以上的巢狀 Comprehension 很難維護。寫完自己讀一次,三秒內看不懂就拆開。
總結
List Comprehension 語法是 [運算式 for 元素 in 來源 if 條件]:過濾的 if 在後、轉換的 if else 在前,dict 與 set 也有對應寫法。它讓程式更簡潔,但底線是可讀性——看不懂就回去寫 for。下一篇回頭把字串的常用方法一次補齊。