Python 列表推导式中如何使用 if-else?
列表推导式中 if-else 放在 for 前面:[x if 条件 else y for x in 列表];纯过滤 if 放在 for 后面。两种位置语义不同,本文详解区别。
关键区分两种位置:if-else 放在 for 前面(对每个元素做条件转换);单个 if 放在 for 后面(过滤元素)。
条件转换:if-else 在 for 前
numbers = [1, 2, 3, 4, 5]
# 偶数保留,奇数翻倍
result = [x if x % 2 == 0 else x * 2 for x in numbers]
print(result) # [2, 2, 6, 4, 10]
语法:[真值表达式 if 条件 else 假值表达式 for x in 可迭代对象]
过滤:if 在 for 后
# 只保留偶数
evens = [x for x in numbers if x % 2 == 0]
print(evens) # [2, 4]
两者结合
# 对偶数取平方,奇数丢弃——先过滤再转换
[x ** 2 if x % 2 == 0 else None for x in numbers] # 错误示范,会产生 None
# 正确:先过滤(后 if),再转换(前表达式)
[x ** 2 for x in numbers if x % 2 == 0] # [4, 16]
记忆口诀
for前的if-else:对每个元素二选一做转换(元素总数不变);for后的if:筛掉不满足条件的元素(元素变少)。
常见问题(FAQ)
Q:能写多个条件吗?
A:可以链式:[f(x) if c1 else g(x) if c2 else h(x) for x in l],但超过两个分支就该用普通 for 循环了,可读性优先。
Q:for 后能写多个 if 吗?
A:可以,[x for x in l if x > 0 if x % 2 == 0] 等价于 if x > 0 and x % 2 == 0。
Q:推导式太长了怎么办?
A:Python 之禅:简洁优于晦涩。条件复杂时老实写 for 循环,没人会给你扣分。