Python列表推導式入門
1. 列表推導式基礎
基本語法:
[表達式 for 變量 in 可迭代對象 if 條件]
列表推導式是Python中一種簡潔、優雅的列表創建方式,可以用一行代碼替代傳統的for循環。
# 基本列表推導式
# 生成1-10的平方數
squares = [x**2 for x in range(1, 11)] # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 使用條件過濾
# 生成1-10中的偶數
evens = [x for x in range(1, 11) if x % 2 == 0] # [2, 4, 6, 8, 10]
# 字符串處理
# 提取所有大寫字母
text = "Hello World Python"
uppercase = [char for char in text if char.isupper()] # ['H', 'W', 'P']
與傳統for循環的對比
# 傳統for循環
squares = []
for x in range(1, 11):
squares.append(x**2)
# 列表推導式
squares = [x**2 for x in range(1, 11)]
# 兩種方式得到相同結果,但列表推導式更簡潔
2. 進階用法
嵌套列表推導式
# 生成九九乘法表
multiplication = [[i*j for j in range(1, i+1)] for i in range(1, 10)]
# 矩陣轉置
matrix = [[1, 2, 3], [4, 5, 6]]
transposed = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
# 展平嵌套列表
nested = [[1, 2], [3, 4], [5, 6]]
flattened = [num for sublist in nested for num in sublist] # [1, 2, 3, 4, 5, 6]
條件表達式(三元運算符)
# 根據條件生成不同的值
numbers = [x if x > 5 else 0 for x in range(10)] # [0, 0, 0, 0, 0, 0, 6, 7, 8, 9]
# 處理可能的None值
data = [1, None, 3, None, 5]
cleaned = [x if x is not None else 0 for x in data] # [1, 0, 3, 0, 5]
3. 實際應用範例
數據處理
# 數據清洗和轉換
temperatures = ['23°C', '25°C', '20°C', '22°C']
celsius = [int(temp.replace('°C', '')) for temp in temperatures]
# 文件路徑處理
files = ['doc1.txt', 'img.jpg', 'doc2.txt', 'doc3.pdf']
txt_files = [f for f in files if f.endswith('.txt')]
# 字典數據提取
students = [
{'name': '小明', 'score': 85},
{'name': '小華', 'score': 92},
{'name': '小芳', 'score': 78}
]
high_scores = [s['name'] for s in students if s['score'] >= 85]
性能注意事項
- 對於簡單的列表創建,列表推導式通常比傳統for循環更快
- 過於複雜的邏輯建議使用傳統for循環,以提高代碼可讀性
- 處理大量數據時要注意內存使用
4. 練習題
-
基礎練習:
- 生成1-100中所有3的倍數
- 將字符串列表中的所有單詞轉換為大寫
- 過濾出列表中的所有正數
- 生成一個5×5的單位矩陣
-
進階練習:
- 實現撲克牌生成器(52張牌)
- 處理CSV數據(提取特定列)
- 圖像像素處理(RGB值轉換)
5. 常見問題解答
Q1: 什麼時候應該使用列表推導式?
當需要根據現有數據創建新列表,且邏輯相對簡單時。
Q2: 列表推導式和map/filter函數的區別?
列表推導式通常更易讀,而map/filter在某些情況下可能更適合函數式編程風格。
Q3: 如何處理複雜的條件判斷?
對於複雜的條件,建議使用傳統的for循環或將邏輯拆分為多個步驟。