列表推導式(List Comprehensions)是 Python 中的一種簡潔且強大的語法,用於從一個可迭代對象(如列表、元組、字典、集合等)生成新的列表。它能夠在一行代碼中表達迴圈和條件語句,讓代碼更加簡潔明了。
[expression for item in iterable if condition]
expression
:對item
的處理(可以是原樣返回、函數調用、或運算)。for item in iterable
:遍歷一個可迭代對象(如列表)。if condition
:可選,用來篩選符合條件的item
。
使用列表推導式創建一個新的列表,該列表由現有列表中的每個元素加倍後得到:
numbers = [1, 2, 3, 4, 5]
doubled_numbers = [x * 2 for x in numbers]
print(doubled_numbers) # 輸出: [2, 4, 6, 8, 10]
你還可以在列表推導式中添加條件語句,用於篩選元素。
numbers = [1, 2, 3, 4, 5, 6]
squared_even_numbers = [x**2 for x in numbers if x % 2 == 0]
print(squared_even_numbers) # 輸出: [4, 16, 36]
列表推導式還可以嵌套,用於生成更複雜的數據結構。下面的例子展示了如何創建一個 2x2 的矩陣:
matrix = [[row * col for col in range(1, 3)] for row in range(1, 3)]
print(matrix) # 輸出: [[1, 2], [2, 4]]
當有多個迴圈時,列表推導式也可以在一行中處理。以下範例會生成所有可能的(x, y)
組合,x
來自[1, 2, 3]
,y
來自[4, 5, 6]
:
combinations = [(x, y) for x in [1, 2, 3] for y in [4, 5, 6]]
print(combinations) # 輸出: [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
除了if
語句過濾外,還可以在expression
中使用條件運算符來處理不同情況。例如,對一個列表中的偶數進行平方,奇數不變:
numbers = [1, 2, 3, 4, 5]
result = [x**2 if x % 2 == 0 else x for x in numbers]
print(result) # 輸出: [1, 4, 3, 16, 5]
列表推導式通常比傳統的 for 迴圈更加高效,因為它在底層進行了優化。不過,當涉及大量數據時,生成器表達式(Generator Expressions)會是一個更好的選擇,它不會一次性將所有結果存儲在內存中,而是以懶加載的方式生成結果。
# 使用括號生成一個生成器而不是列表
numbers = [1, 2, 3, 4, 5]
generator = (x * 2 for x in numbers)
print(list(generator)) # 輸出: [2, 4, 6, 8, 10]
以下是一個傳統for迴圈的示例,與對應的列表推導式對比:
# 傳統的for迴圈方式
squares = []
for x in range(1, 6):
squares.append(x**2)
print(squares) # 輸出: [1, 4, 9, 16, 25]
# 使用列表推導式
squares = [x**2 for x in range(1, 6)]
print(squares) # 輸出: [1, 4, 9, 16, 25]