Python 列表推导式
列表推导式用一行 [ ... for ... in ... ] 从可迭代对象生成新列表,等价于常见的「先 for 再 append」模式,往往更紧凑。基础见 列表、循环;条件表达式见 三元运算符。
基本形式
python
新列表 = [表达式 for 变量 in 可迭代对象]python
numbers = [1, 2, 3, 4, 5]
squares = [num**2 for num in numbers]
print(squares)输出:
text
[1, 4, 9, 16, 25]从左读:for 变量 in 可迭代对象 提供逐个元素,表达式 对每个元素求值后进入结果列表(不是「从右到左执行整句」)。
带 if 过滤
python
numbers = range(20)
even_numbers = [num for num in numbers if num % 2 == 0]
words = ["cat", "elephant", "dog", "hippopotamus", "ant"]
long_words = [word for word in words if len(word) > 4]对 [expr for x in it if cond]:对每个 x,先判断 cond,为真才计算 expr。
变换 + 过滤
python
mixed = ["42", "apple", "17", "banana", "99", "cherry"]
nums = [int(item) for item in mixed if item.isdigit()]
values = list(range(1, 11))
even_squares = [n**2 for n in values if n % 2 == 0]表达式里的三元运算
与末尾过滤 if 不同:下面会对每个元素求值,按条件选两种结果之一。
python
numbers = [1, 2, 3, 4, 5, 6]
labels = ["even" if n % 2 == 0 else "odd" for n in numbers]
values = [5, -3, 8, -1, 12, -7]
clamped = [n if n >= 0 else 0 for n in values]模式:A if 条件 else B 写在最前面,后面再写 for ...。
多个 for(嵌套与笛卡尔积)
从左到右的 for 等价于外层到内层循环。
python
table = [[i * j for j in range(1, 6)] for i in range(1, 6)]
pairs = [(x, y) for x in range(3) for y in range(3)]扁平化嵌套列表
python
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [num for row in matrix for num in row]
irregular = [[10, 20], [30], [40, 50, 60], [70, 80]]
all_vals = [x for sub in irregular for x in sub]等价于:
python
flat = []
for row in matrix:
for num in row:
flat.append(num)多个 if(且)
python
nums = range(100)
both = [n for n in nums if n % 3 == 0 if n % 5 == 0]
words = ["Python", "code", "programming", "data", "analysis"]
picked = [w for w in words if len(w) > 4 if w[0] in "Pp"]多个 if 表示同时满足(逻辑与)。也可写成 if cond1 and cond2。
与 enumerate 结合
python
fruits = ["apple", "banana", "cherry", "date"]
indexed = [(i, f) for i, f in enumerate(fruits)]
numbers = [10, 20, 30, 40, 50]
at_even_index = [n for i, n in enumerate(numbers) if i % 2 == 0]字符串
python
text = "comprehension"
vowels = [c for c in text if c in "aeiou"]
word = "Python"
codes = [ord(c) for c in word]
sentence = " hello world "
letters_only = "".join([c.upper() for c in sentence if not c.isspace()])与 map / filter
python
numbers = [1, 2, 3, 4, 5]
squared_map = list(map(lambda x: x**2, numbers))
squared_lc = [x**2 for x in numbers]
evens_f = list(filter(lambda x: x % 2 == 0, numbers))
evens_lc = [x for x in numbers if x % 2 == 0]
combined = [x**2 for x in numbers if x % 2 == 0]推导式通常更易读;是否更快取决于版本与场景,不必教条化。
字典的 items()
python
prices = {"apple": 1.2, "banana": 0.5, "cherry": 2.5, "date": 3.0}
expensive = [name for name, p in prices.items() if p > 1.0]
scores = {"Alice": 95, "Bob": 87, "Charlie": 92}
lines = [f"{name}: {s}%" for name, s in scores.items()]集合推导式与字典推导式
语法与列表推导式类似,分别用 {} 表示集合或键值对。
python
numbers = [1, 2, 2, 3, 3, 3, 4]
unique_squares = {n**2 for n in numbers}
words = ["apple", "banana", "cherry"]
lengths = {w: len(w) for w in words}
original = {"a": 1, "b": 2, "c": 3}
inverted = {v: k for k, v in original.items()}set 无固定打印顺序。字典键唯一:若 v 重复,反转时后者覆盖前者。
何时不用推导式
嵌套过深、分支过多时,普通 for 更清晰:
python
nested_list = [["ab", "12"], ["Hello", "xy"], ["a"]]
# 复杂推导可读性差时,改用显式循环
result = []
for sub in nested_list:
if len(sub) > 1:
row = []
for item in sub:
if item.isalpha():
row.append(item.upper() if len(item) > 3 else item.lower())
result.append(row)避免在推导式里写强副作用(如改全局、写文件),否则顺序与可读性都难保证。
小结
| 形式 | 含义 |
|---|---|
[f(x) for x in it] | 映射 |
[f(x) for x in it if cond] | 过滤再映射 |
[a if c else b for x in it] | 每项二选一 |
[... for x in A for y in B] | 嵌套循环 |