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 迴圈。
- if 篩選放在 for 子句之後。
- 輸出鍵值對時使用字典推導式。
- 表達式要短到能一次讀完。
常見問題
推導式比迴圈快嗎?
簡單轉換可能更快,但對初學者來說可讀性更重要。只有性能真的成為問題時才做測量。
可以用推導式產生副作用嗎?
可以,但含義不清楚。目標是列印、儲存或修改外部狀態時,用普通 for 迴圈。
列表推導式和生成器表達式有什麼區別?
列表推導式會立即建構完整列表;生成器表達式按需產生值,處理大資料時可能更省記憶體。
練習推導式
12 道題,覆蓋映射、篩選、字典推導式和巢狀迴圈。
繼續閱讀: