Skip to content

Python 列表推导式

列表推导式用一行 [ ... for ... in ... ] 从可迭代对象生成新列表,等价于常见的「先 forappend」模式,往往更紧凑。基础见 列表循环;条件表达式见 三元运算符

基本形式

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]嵌套循环

参考