Python 列表推导式中如何使用 if-else?

列表推导式中 if-else 放在 for 前面:[x if 条件 else y for x in 列表];纯过滤 if 放在 for 后面。两种位置语义不同,本文详解区别。

最佳实践
Python 列表推导式中如何使用 if-else?封面

关键区分两种位置: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 循环,没人会给你扣分。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台