使用 Python 列表推導式解決實際問題
列表推導式是 Python 中非常強大且靈活的特性之一,它能夠讓你以一種簡潔明了的方式創建列表。本文將從基礎到高級逐步介紹列表推導式的使用方法,并通過實際案例幫助你更好地理解和掌握這一技巧。
1. 基本列表推導式
列表推導式的基本語法如下:
new_list = [expression for item in iterable]
這里,expression 是對 item 進行操作的表達式,iterable 是一個可迭代對象,如列表、元組、字符串等。
示例 1:生成一個包含 1 到 10 的平方的列表
squares = [x**2 for x in range(1, 11)]
print(squares) # 輸出: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
2. 帶條件的列表推導式
你可以在列表推導式中添加條件語句,以便只對滿足特定條件的元素進行操作。
示例 2:生成一個包含 1 到 10 中偶數的平方的列表
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(even_squares) # 輸出: [4, 16, 36, 64, 100]
3. 多層嵌套的列表推導式
列表推導式可以嵌套使用,這樣可以處理更復雜的結構。
示例 3:生成一個二維列表,其中每個子列表包含 1 到 3 的平方
nested_list = [[x**2 for x in range(1, 4)] for _ in range(3)]
print(nested_list) # 輸出: [[1, 4, 9], [1, 4, 9], [1, 4, 9]]
4. 使用多個可迭代對象
你可以在列表推導式中使用多個可迭代對象,這在處理多個數據源時非常有用。
示例 4:生成一個列表,包含兩個列表中所有可能的組合
list1 = [1, 2, 3]
list2 = ['a', 'b']
combinations = [(x, y) for x in list1 for y in list2]
print(combinations) # 輸出: [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (3, 'a'), (3, 'b')]
5. 使用復雜表達式
列表推導式中的表達式可以非常復雜,可以包含函數調用、條件表達式等。
示例 5:生成一個列表,包含字符串列表中每個字符串的長度
words = ["apple", "banana", "cherry"]
lengths = [len(word) for word in words]
print(lengths) # 輸出: [5, 6, 6]
6. 高級技巧:使用列表推導式進行數據清洗
列表推導式在數據清洗中也非常有用,可以幫助你快速過濾和轉換數據。
示例 6:去除字符串列表中的空字符串
dirty_data = ["apple", "", "banana", "", "cherry"]
clean_data = [word for word in dirty_data if word != ""]
print(clean_data) # 輸出: ['apple', 'banana', 'cherry']
7. 實戰案例:處理日志文件
假設你有一個日志文件,每行記錄了一個用戶的訪問時間。你想要提取出所有訪問時間在上午 9 點到 11 點之間的記錄。
日志文件內容(log.txt):
2023-10-01 08:30:00 - User1
2023-10-01 09:15:00 - User2
2023-10-01 10:45:00 - User3
2023-10-01 12:00:00 - User4
代碼實現:
# 讀取日志文件
with open('log.txt', 'r') as file:
logs = file.readlines()
# 使用列表推導式提取符合條件的記錄
filtered_logs = [
log.strip() for log in logs
if '09:' <= log[11:13] < '12:'
]
# 打印結果
for log in filtered_logs:
print(log)
輸出:
2023-10-01 09:15:00 - User2
2023-10-01 10:45:00 - User3
總結
本文介紹了 Python 列表推導式的基本用法,包括基本列表推導式、帶條件的列表推導式、多層嵌套的列表推導式、使用多個可迭代對象、復雜表達式以及數據清洗中的應用。通過實際案例,展示了如何使用列表推導式處理日志文件中的數據。