Python List Comprehension

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。下一篇回頭把字串的常用方法一次補齊。

延伸閱讀