專項練習 · 7 分鐘閱讀

Python 列表推導式練習:映射、篩選與建構

推導式是建構集合的緊湊寫法。真正該問的不是「能不能寫短」,而是「轉換是否仍然一眼可見」。

映射每個值

for 前面的表達式會為每個元素求值,結果是一個新列表。表達式要短到讀者一眼能看出輸入和輸出。

nums = [1, 2, 3]
doubled = [n * 2 for n in nums]
print(doubled)

轉換每個元素

先篩選,再轉換

末尾的 if 子句只保留通過測試的值,條件放在 for 子句之後。如果條件需要多個分支,普通迴圈更合適。

nums = [1, 2, 3, 4]
even = [n for n in nums if n % 2 == 0]
print(even)

保留偶數值

建構字典

字典推導式在 for 前使用 鍵: 值。需要同時拿到原鍵和值時,走訪 items()。結果是新字典,不會修改原字典。

prices = {"latte": 4.5, "tea": 3.0}
expensive = {name: price for name, price in prices.items() if price >= 4}
print(expensive)

篩選字典

一個表達式裡的巢狀迴圈

巢狀推導式從左到右讀,就像巢狀的 for 迴圈。第一個 for 是外層迴圈。順序不好解釋時,先寫普通迴圈再對比。

pairs = [(x, y) for x in [1, 2] for y in [3, 4]]
print(pairs)

小型的笛卡爾積

可讀性優先於技巧

推導式應該替代迴圈,而不是把迴圈藏起來。如果表達式裡需要註解,或者讀者要讀兩遍,就改用命名函式或普通迴圈。短不等於清楚。

names = ["latte", "tea"]
labels = [name.upper() for name in names if len(name) > 3]
print(labels)

短而可讀的篩選

你的練習清單

常見問題

推導式比迴圈快嗎?

簡單轉換可能更快,但對初學者來說可讀性更重要。只有性能真的成為問題時才做測量。

可以用推導式產生副作用嗎?

可以,但含義不清楚。目標是列印、儲存或修改外部狀態時,用普通 for 迴圈。

列表推導式和生成器表達式有什麼區別?

列表推導式會立即建構完整列表;生成器表達式按需產生值,處理大資料時可能更省記憶體。

練習推導式

12 道題,覆蓋映射、篩選、字典推導式和巢狀迴圈。

打開練習

繼續閱讀: