列表推导式是 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 列表推导式中的嵌套逻辑,从基本的列表推导式到单层条件过滤,再到嵌套循环和多层嵌套,最后通过一个实战案例展示了如何生成指定范围内的素数列表。