如何理解Python中列表接条件索引的写法,是否属于列表推导?
问题解答
你看到的写法没有专属的特殊语法名称,本质是两个Python基础特性的组合用法,完全不属于列表推导式范畴。
先把两个版本的代码放在一起对照说明:
逻辑直观的分支判断实现:
def bmi(weight, height): bmi = weight / height ** 2 if bmi <= 18.5: return "Underweight" elif bmi <= 25: return "Normal" elif bmi <= 30: return "Overweight" else: return "Obese"
参考解答里的简洁实现:
def bmi(weight, height): b = weight / height ** 2 return ['Underweight', 'Normal', 'Overweight', 'Obese'][(b > 30) + (b > 25) + (b > 18.5)]
这个写法用到的两个核心规则都是Python入门级基础知识点:
- 第一对方括号是普通的列表字面量,按BMI从低到高的顺序存储了四个分类结果;紧跟的第二对方括号没有任何特殊之处,就是最常用的列表下标索引访问,和平时写
arr[0]取列表第一个元素的逻辑完全一致。 - Python的布尔类型是整数类型的子类:
True的整数值等价于1,False的整数值等价于0,多个布尔值直接相加的结果,就是判断结果为真的条件总数,这个数值刚好可以作为索引匹配列表里的对应分类。
运行逻辑拆解
代入不同区间的BMI值计算索引,就能看到它和分支逻辑完全等价:
- 当b ≤ 18.5时:
b>30、b>25、b>18.5三个判断全为False,求和结果为0,取列表第0位的Underweight - 当18.5 < b ≤ 25时:仅
b>18.5为True,其余两个判断为False,求和结果为1,取列表第1位的Normal - 当25 < b ≤ 30时:
b>25、b>18.5两个判断为True,求和结果为2,取列表第2位的Overweight - 当b > 30时:三个判断全为True,求和结果为3,取列表第3位的
Obese
注意:这种写法属于偏炫技的短代码实现,对判断条件的排列顺序要求极高,一旦写错条件顺序就会返回完全错误的结果,可读性远低于直观的if-elif分支写法,生产环境更推荐使用你最初编写的分支版本,降低后续维护的理解成本。
内容的提问来源于stack exchange,提问作者LN3
相关产品推荐
相关产品推荐

