Python List Comprehension 串列生成式
List Comprehension 是 Python 中建立 list 的簡潔語法。
基本語法
# 傳統 for 迴圈
squares = []
for x in range(5):
squares.append(x ** 2)
print(squares) # [0, 1, 4, 9, 16]
# List Comprehension
squares = [x ** 2 for x in range(5)]
print(squares) # [0, 1, 4, 9, 16]
語法結構
[expression for item in iterable]
[expression for item in iterable if condition]
帶條件的 List Comprehension
# 只保留偶數
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = [n for n in numbers if n % 2 == 0]
print(evens) # [2, 4, 6, 8, 10]
# 只保留正數
numbers = [-2, -1, 0, 1, 2]
positives = [n for n in numbers if n > 0]
print(positives) # [1, 2]
if-else 條件
# 條件表達式放在 expression 部分
numbers = [1, 2, 3, 4, 5]
result = ["even" if n % 2 == 0 else "odd" for n in numbers]
print(result) # ['odd', 'even', 'odd', 'even', 'odd']
# 將負數轉為 0
numbers = [-2, -1, 0, 1, 2]
result = [n if n >= 0 else 0 for n in numbers]
print(result) # [0, 0, 0, 1, 2]
巢狀迴圈
# 傳統寫法
result = []
for i in range(3):
for j in range(3):
result.append((i, j))
print(result) # [(0, 0), (0, 1), (0, 2), (1, 0), ...]
# List Comprehension
result = [(i, j) for i in range(3) for j in range(3)]
print(result) # [(0, 0), (0, 1), (0, 2), (1, 0), ...]
展開二維 list
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [num for row in matrix for num in row]
print(flat) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
巢狀 List Comprehension
# 建立二維 list
matrix = [[i * 3 + j for j in range(3)] for i in range(3)]
print(matrix) # [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
# 轉置矩陣
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
transposed = [[row[i] for row in matrix] for i in range(3)]
print(transposed) # [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
實際範例
字串處理
words = ["Hello", "World", "Python"]
# 轉小寫
lower = [w.lower() for w in words]
print(lower) # ['hello', 'world', 'python']
# 取得長度
lengths = [len(w) for w in words]
print(lengths) # [5, 5, 6]
# 過濾長度
long_words = [w for w in words if len(w) > 5]
print(long_words) # ['Python']
數字處理
# 將字串轉為數字
str_numbers = ["1", "2", "3", "4", "5"]
numbers = [int(s) for s in str_numbers]
print(numbers) # [1, 2, 3, 4, 5]
# 計算平方根(只對正數)
import math
numbers = [4, -1, 9, -4, 16]
roots = [math.sqrt(n) for n in numbers if n >= 0]
print(roots) # [2.0, 3.0, 4.0]
字典和 list 互轉
# 從字典建立 list
d = {"a": 1, "b": 2, "c": 3}
keys = [k for k in d]
values = [v for v in d.values()]
items = [(k, v) for k, v in d.items()]
print(keys) # ['a', 'b', 'c']
print(values) # [1, 2, 3]
print(items) # [('a', 1), ('b', 2), ('c', 3)]
過濾資料
students = [
{"name": "Alice", "score": 85},
{"name": "Bob", "score": 72},
{"name": "Charlie", "score": 90},
{"name": "David", "score": 65}
]
# 及格的學生
passed = [s["name"] for s in students if s["score"] >= 70]
print(passed) # ['Alice', 'Bob', 'Charlie']
讀取檔案
# 讀取非空白行
# lines = [line.strip() for line in open("file.txt") if line.strip()]
# 模擬
lines = [" hello \n", "\n", " world \n", " \n"]
cleaned = [line.strip() for line in lines if line.strip()]
print(cleaned) # ['hello', 'world']
組合元素
colors = ["red", "green", "blue"]
sizes = ["S", "M", "L"]
combinations = [f"{c}-{s}" for c in colors for s in sizes]
print(combinations)
# ['red-S', 'red-M', 'red-L', 'green-S', 'green-M', 'green-L', 'blue-S', 'blue-M', 'blue-L']
Dict Comprehension
# 建立字典
squares = {x: x ** 2 for x in range(5)}
print(squares) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 過濾字典
original = {"a": 1, "b": 2, "c": 3, "d": 4}
filtered = {k: v for k, v in original.items() if v > 2}
print(filtered) # {'c': 3, 'd': 4}
# 交換 key 和 value
swapped = {v: k for k, v in original.items()}
print(swapped) # {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
Set Comprehension
# 建立 set
squares = {x ** 2 for x in range(-3, 4)}
print(squares) # {0, 1, 4, 9}
Generator Expression
使用圓括號建立生成器(記憶體效率更高):
# Generator Expression(不會立即計算)
gen = (x ** 2 for x in range(1000000))
# List Comprehension(立即建立完整 list)
# lst = [x ** 2 for x in range(1000000)] # 佔用較多記憶體
# 用於函數參數時可以省略括號
total = sum(x ** 2 for x in range(10))
print(total) # 285
何時使用 List Comprehension
✅ 適合使用:
- 簡單的轉換和過濾
- 程式碼可讀性高
❌ 避免使用:
- 邏輯複雜時(改用傳統迴圈)
- 有副作用的操作(如修改外部變數)
# 太複雜,不建議
result = [x if x > 0 else -x if x < -10 else 0 for x in numbers if x != 5]
# 改用傳統迴圈更清楚
result = []
for x in numbers:
if x == 5:
continue
if x > 0:
result.append(x)
elif x < -10:
result.append(-x)
else:
result.append(0)