一文掌握 Python 列表推導式中的嵌套邏輯
列表推導式是 Python 中一個非常強大的工具,可以讓你以簡潔的方式創建列表。當你掌握了基本的列表推導式后,下一步就是學習如何在列表推導式中使用嵌套邏輯。本文將逐步引導你從簡單的嵌套邏輯到更復雜的多層嵌套,幫助你全面掌握這一技能。
1. 基本的列表推導式
首先,我們回顧一下基本的列表推導式。假設我們要創建一個包含 0 到 9 的平方的列表:
squares = [x**2 for x in range(10)]
print(squares)
# 輸出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
這段代碼中,[x**2 for x in range(10)] 就是一個列表推導式,它遍歷 range(10) 中的每個元素 x,并計算 x**2,最終生成一個列表。
2. 單層條件過濾
在列表推導式中加入條件過濾可以讓我們更靈活地控制生成的列表。例如,我們只保留平方數中偶數的部分:
even_squares = [x**2 for x in range(10) if x**2 % 2 == 0]
print(even_squares)
# 輸出: [0, 4, 16, 36, 64]
這里,if x**2 % 2 == 0 是一個條件過濾,只有當 x**2 是偶數時,才會將其添加到列表中。
3. 嵌套循環
接下來,我們來看看如何在列表推導式中使用嵌套循環。假設我們有兩個列表 a 和 b,我們想創建一個新的列表,包含所有可能的 (x, y) 組合:
a = [1, 2, 3]
b = ['a', 'b', 'c']
combinations = [(x, y) for x in a for y in b]
print(combinations)
# 輸出: [(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]
這里的 [(x, y) for x in a for y in b] 表示先遍歷 a 中的每個元素 x,然后對于每個 x,再遍歷 b 中的每個元素 y,生成 (x, y) 對。
4. 嵌套條件過濾
在嵌套循環中,我們也可以加入條件過濾。假設我們只想保留 x 和 y 之和為奇數的組合:
a = [1, 2, 3]
b = ['a', 'b', 'c']
filtered_combinations = [(x, y) for x in a for y in b if (x + ord(y)) % 2 != 0]
print(filtered_combinations)
# 輸出: [(1, 'a'), (1, 'c'), (2, 'b'), (3, 'a'), (3, 'c')]
這里,if (x + ord(y)) % 2 != 0 是一個條件過濾,只有當 x 和 y 的 ASCII 值之和為奇數時,才會將其添加到列表中。
5. 多層嵌套
在某些情況下,我們可能需要更深層次的嵌套。假設我們有一個二維列表,我們想將其展平成一維列表:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened)
# 輸出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
這里的 [num for row in matrix for num in row] 表示先遍歷 matrix 中的每一行 row,然后對于每一行 row,再遍歷其中的每個元素 num,生成一維列表。
6. 嵌套列表推導式
有時候,我們需要在列表推導式中嵌套另一個列表推導式。假設我們有一個列表,每個元素都是一個列表,我們想創建一個新的列表,每個元素是原列表中對應位置的最大值:
lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
max_values = [max(row) for row in lists]
print(max_values)
# 輸出: [3, 6, 9]
這里的 [max(row) for row in lists] 表示遍歷 lists 中的每一行 row,并計算每行的最大值,生成新的列表。
7. 實戰案例:生成素數列表
最后,我們來看一個實際的案例:生成一個指定范圍內的所有素數。素數是指只能被 1 和自身整除的自然數。
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
primes = [x for x in range(2, 50) if is_prime(x)]
print(primes)
# 輸出: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
這里,is_prime 函數用于判斷一個數是否為素數,[x for x in range(2, 50) if is_prime(x)] 表示遍歷 2 到 49 之間的每個數 x,如果 x 是素數,則將其添加到列表中。
總結
本文介紹了 Python 列表推導式中的嵌套邏輯,從基本的列表推導式到單層條件過濾,再到嵌套循環和多層嵌套,最后通過一個實戰案例展示了如何生成指定范圍內的素數列表。