


























Python 3 中的列表推导式(List Comprehension)是一种简洁、优雅的构造列表的方式,它允许你通过对序列中的元素应用表达式,并可选地添加条件过滤,来快速生成新列表。相比传统的 for 循环,列表推导式不仅代码更精简,而且通常执行效率更高。
[expression for item in iterable if condition]
expression:对每个元素执行的表达式(可以是运算、函数调用等)。item:从可迭代对象(如列表、元组、字符串、range 等)中取出的变量名。iterable:任何可迭代对象。if condition(可选):过滤条件,只有满足条件的元素才会被包含。将每个数字平方:
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
只取偶数平方:
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]
将字符串列表转为大写,并过滤掉长度小于 3 的元素:
words = ["apple", "hi", "world", "a"]
result = [w.upper() for w in words if len(w) >= 3]
print(result) # ['APPLE', 'WORLD']
列表推导式可以包含多个 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))
# 求两个列表中所有可能的数对,要求和为偶数
result = [(x, y) for x in [1, 2, 3] for y in [4, 5, 6] if (x + y) % 2 == 0]
可以在表达式中使用 if-else 来改变输出的值:
# 将偶数变为 'even',奇数变为 'odd'
labels = ['even' if x % 2 == 0 else 'odd' for x in range(5)]
print(labels) # ['even', 'odd', 'even', 'odd', 'even']
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']
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
col2 = [row[1] for row in matrix] # 第二列
print(col2) # [2, 5, 8]
作用域:在 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)),它返回一个生成器,按需产出元素。
| 方式 | 代码 | 特点 |
|---|---|---|
| 普通 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 |
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
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。