Python 编程 - 列表推导式

Python 3 中的列表推导式(List Comprehension)是一种简洁、优雅的构造列表的方式,它允许你通过对序列中的元素应用表达式,并可选地添加条件过滤,来快速生成新列表。相比传统的 for 循环,列表推导式不仅代码更精简,而且通常执行效率更高。


1. 基本语法

[expression for item in iterable if condition]
  • expression:对每个元素执行的表达式(可以是运算、函数调用等)。
  • item:从可迭代对象(如列表、元组、字符串、range 等)中取出的变量名。
  • iterable:任何可迭代对象。
  • if condition(可选):过滤条件,只有满足条件的元素才会被包含。

2. 基础示例

2.1 简单映射

将每个数字平方:

squares = [x**2 for x in range(10)]
print(squares)   # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

2.2 带条件过滤

只取偶数平方:

even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares)   # [0, 4, 16, 36, 64]

2.3 对字符串操作

将字符串列表转为大写,并过滤掉长度小于 3 的元素:

words = ["apple", "hi", "world", "a"]
result = [w.upper() for w in words if len(w) >= 3]
print(result)   # ['APPLE', 'WORLD']

3. 嵌套循环

列表推导式可以包含多个 for 子句,相当于嵌套循环。

# 生成笛卡尔积
pairs = [(x, y) for x in [1, 2, 3] for y in ['a', 'b']]
print(pairs)
# [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (3, 'a'), (3, 'b')]

相当于:

pairs = []
for x in [1, 2, 3]:
    for y in ['a', 'b']:
        pairs.append((x, y))

多重条件与多个 for

# 求两个列表中所有可能的数对,要求和为偶数
result = [(x, y) for x in [1, 2, 3] for y in [4, 5, 6] if (x + y) % 2 == 0]

4. 高级用法

4.1 条件表达式(三元运算符)在推导式中

可以在表达式中使用 if-else 来改变输出的值:

# 将偶数变为 'even',奇数变为 'odd'
labels = ['even' if x % 2 == 0 else 'odd' for x in range(5)]
print(labels)   # ['even', 'odd', 'even', 'odd', 'even']

4.2 使用 zip 同时迭代多个序列

names = ['Alice', 'Bob', 'Charlie']
scores = [85, 92, 78]
result = [f'{name}: {score}' for name, score in zip(names, scores)]
print(result)   # ['Alice: 85', 'Bob: 92', 'Charlie: 78']

4.3 获取多维列表的某个列

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
col2 = [row[1] for row in matrix]   # 第二列
print(col2)   # [2, 5, 8]

5. Python 3 中的特殊注意事项

  • 作用域:在 Python 3 中,列表推导式中的循环变量(如上面的 x)是局部作用域的,不会泄露到外部命名空间(而在 Python 2 中会)。这避免了意外的变量污染。

    x = 10
    [x**2 for x in range(3)]
    print(x)   # Python 3 输出 10,Python 2 输出 2
    
  • 内存效率:列表推导式会一次性生成完整的列表,占用内存。如果数据量很大,建议使用生成器表达式(expression for item in iterable)),它返回一个生成器,按需产出元素。


6. 与其他方式的对比

方式 代码 特点
普通 for 循环 result = []
for x in range(10):
  result.append(x**2)
可读性强,但冗长
map + filter list(map(lambda x: x**2, filter(lambda x: x%2==0, range(10)))) 函数式,但可读性较差
列表推导式 [x**2 for x in range(10) if x%2==0] 最简洁、直观,且性能通常优于 map/filter + lambda

7. 扩展:其他推导式

Python 3 还支持类似的语法用于集合({})、字典({key: value})和生成器(()):

# 集合推导式
s = {x**2 for x in range(5)}   # {0, 1, 4, 9, 16}

# 字典推导式
d = {x: x**2 for x in range(5)}   # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 生成器表达式(不立即生成列表,惰性求值)
gen = (x**2 for x in range(5))
print(next(gen))   # 0

8. 总结

  • 列表推导式是 Python 中推荐的列表构造方式,在保持可读性的同时减少代码量。
  • 适用于简单的循环和过滤逻辑;若逻辑过于复杂(比如需要异常处理或大量嵌套),建议使用普通循环以保持清晰。
  • 在 Python 3 中,推导式的变量是局部作用域,更安全。
  • 当数据量大时,优先考虑生成器表达式以节省内存。
posted @ 2026-06-21 20:41  箫笛  阅读(23)  评论(0)    收藏  举报