列表推导式中if-else必须作为三元表达式置于for左侧,如[x if x>=0 else 0 for x in numbers];仅if过滤则置于for右侧,如[x for x in numbers if x>0]。

在列表推导式中同时使用 if 和 else,必须把整个条件表达式写在前面(即“值部分”),不能把 if 放在后面。这是初学者最容易出错的地方。
正确语法:三元表达式放在 for 前面
格式为:[value_if_true if condition else value_if_false for item in iterable]
- 条件判断(
if...else)是整体作为“生成什么值”的逻辑,属于表达式,必须出现在for左侧 - 不能写成
[x for x in lst if x > 0 else 0]—— 这是语法错误 - 例如:将负数转为 0,非负数保持原值
result = [x if x >= 0 else 0 for x in numbers]
# 得到 [0, 0, 0, 1, 2]
对比:只有 if(无 else)时的写法
纯过滤用法,if 写在 for 后面,不带 else
- 作用是筛选元素,不是变换值
- 语法:
[expr for item in iterable if condition] - 例如:只保留正数
positives = [x for x in numbers if x > 0]
# 得到 [1, 2]
常见错误与提醒
-
if-else必须成对出现,且只能出现在“值生成位置”,即for左边 - 不能在同一个推导式里既用左侧
if-else又在右侧加if过滤(语法不允许) - 如果逻辑复杂,建议拆成普通循环或用函数封装,避免可读性下降









