本文目录导读:
列表推导式(List Comprehension)是 Python 中一种非常简洁、高效的创建列表的方式,它通常比使用普通的 for 循环写起来更短,运行速度也更快。
基本语法结构
列表推导式的基本结构如下:
[表达式 for 变量 in 可迭代对象 if 条件]
- 表达式:对变量进行运算或转换的结果,这个结果会成为新列表中的一个元素。
- for 变量 in 可迭代对象:循环逻辑,从序列(如列表、字符串、range)中依次取出元素。
- if 条件:(可选)过滤条件,只有满足条件的元素才会被“表达式”处理。
逐步示例
基础用法:不包含 if 条件
需求: 创建一个包含 0 到 9 平方的列表。
- 使用普通 for 循环:
squares = [] for x in range(10): squares.append(x**2) print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] - 使用列表推导式:
squares = [x**2 for x in range(10)] print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
解析: 对于
range(10)中的每个x,计算x**2并放入新列表。
包含 if 条件(过滤)
需求: 创建一个 0 到 9 中偶数的平方的列表。
- 使用普通 for 循环:
even_squares = [] for x in range(10): if x % 2 == 0: even_squares.append(x**2) print(even_squares) # 输出: [0, 4, 16, 36, 64] - 使用列表推导式:
even_squares = [x**2 for x in range(10) if x % 2 == 0] print(even_squares) # 输出: [0, 4, 16, 36, 64]
解析: 先通过
if x % 2 == 0过滤,只留下偶数,然后再进行x**2运算。
包含 if-else 条件(三元表达式)
当你需要在表达式中根据条件输出不同的值时,可以把 if-else 写在表达式中。
需求: 将 0 到 9 中的偶数变为其平方,奇数变为其负数。
- 使用普通 for 循环:
result = [] for x in range(10): if x % 2 == 0: result.append(x**2) else: result.append(-x) print(result) # 输出: [0, -1, 4, -3, 16, -5, 36, -7, 64, -9] - 使用列表推导式:
result = [x**2 if x % 2 == 0 else -x for x in range(10)] print(result) # 输出: [0, -1, 4, -3, 16, -5, 36, -7, 64, -9]
注意这里
if-else的位置: 它放在表达式部分(x**2 if x % 2 == 0 else -x),而不是末尾的过滤条件。
嵌套循环
列表推导式也支持多个 for 循环,等同于普通循环的嵌套。
需求: 将两个列表 ['a', 'b'] 和 [1, 2] 组合成笛卡尔积 [('a', 1), ('a', 2), ('b', 1), ('b', 2)]。
- 使用普通嵌套循环:
pairs = [] for letter in ['a', 'b']: for number in [1, 2]: pairs.append((letter, number)) print(pairs) # 输出: [('a', 1), ('a', 2), ('b', 1), ('b', 2)] - 使用列表推导式:
pairs = [(letter, number) for letter in ['a', 'b'] for number in [1, 2]] print(pairs) # 输出: [('a', 1), ('a', 2), ('b', 1), ('b', 2)]注意:
for循环的顺序与普通嵌套循环一致(外层在前,内层在后)。
对字符串进行操作
需求: 获取一个字符串中所有大写字母。
text = "Hello World! Python is Fun." uppercase_letters = [char for char in text if char.isupper()] print(uppercase_letters) # 输出: ['H', 'W', 'P', 'F']
其他类似推导式
Python 中还有集合推导式和字典推导式,语法非常相似,只是把 换成了 :
集合推导式 (Set Comprehension)
-
使用花括号 。
-
结果是一个集合(元素唯一,无序)。
-
{表达式 for 变量 in 可迭代对象 if 条件}示例: 获取 0 到 9 中偶数的平方,并去重(虽然这里没有重复)。
squares_set = {x**2 for x in range(10) if x % 2 == 0} print(squares_set) # 输出: {0, 64, 4, 36, 16} (顺序可能不同)
字典推导式 (Dictionary Comprehension)
-
使用花括号 。
-
表达式需要返回一个
key: value对。 -
{key_expression: value_expression for 变量 in 可迭代对象 if 条件}示例: 将一个列表的元素作为键,其平方作为值,创建一个字典。
numbers = [1, 2, 3, 4] squares_dict = {x: x**2 for x in numbers} print(squares_dict) # 输出: {1: 1, 2: 4, 3: 9, 4: 16}
生成器表达式 (Generator Expression)
-
使用小括号 。
-
结果是一个生成器对象,它不会一次性生成所有元素,而是“惰性求值”(按需生成),非常节省内存。
-
(表达式 for 变量 in 可迭代对象 if 条件)示例: 计算 0 到 999999 中所有偶数的平方和(用列表推导式会占用大量内存)。
# 使用生成器 (推荐,节省内存) total = sum(x**2 for x in range(1000000) if x % 2 == 0) print(total)
使用建议
- 保持简洁:当逻辑简单(1-2个循环,1个条件)时,推导式非常优雅,如果逻辑复杂,嵌套层次太多(超过2层循环),使用普通
for循环可读性更好。 - 可读性为主:团队协作时,优先考虑代码是否容易理解,不要为了“炫技”写出过于复杂的推导式。
- 性能:在大多数情况下,列表推导式比手动
append的for循环稍快。 - 大列表用生成器:如果数据量非常大(比如几百万个元素),优先考虑使用生成器表达式 而不是列表推导式 ,以避免内存爆满。
标签: 列表推导式