Python列车空闲车厢查找函数的列表推导式及末尾语法疑问
列表推导式收集索引i的逻辑
首先代码里的a = n // len(lst)是先计算单节车厢的最大载客量:总载客量n除以车厢总数len(lst)取整,就是均分后每节车厢的容量上限。
后面的列表推导式[i for i, j in enumerate(lst) if j / a <= 0.5]逻辑如下:
- 用
enumerate(lst)同时遍历车厢列表的索引(赋值给i)和对应车厢的当前载客数(赋值给j) - 用
j / a <= 0.5判断当前车厢的载客占比是否不超过容量的50% - 只要满足判断条件,就把当前车厢的索引
i加入结果列表,遍历顺序是从左到右,所以结果列表里的索引是按车厢顺序从小到大排列的,第一个元素就是首个符合要求的车厢索引。
+[-1]][0][0]部分的作用
我们分步骤拆解这段语法:
+[-1]的作用:给前面列表推导式生成的结果列表拼接固定值-1- 如果存在符合要求的车厢,列表推导式的结果是类似
[2,3,4]的非空列表,拼接后变成[2,3,4,-1] - 如果不存在符合要求的车厢,列表推导式的结果是空列表
[],拼接后变成[-1]
- 如果存在符合要求的车厢,列表推导式的结果是类似
- 外层
[]加[0]的作用:这是一段冗余写法,[[xxx]][0]等价于直接取xxx本身,完全可以省略 - 末尾
[0]的作用:取拼接后列表的第一个元素- 有符合要求的车厢时,拿到的就是首个符合要求的车厢索引
- 没有符合要求的车厢时,拿到的就是提前拼接的
-1,刚好满足需求中不存在就返回-1的要求
补充优化提示:原代码这里的写法可以简化,去掉冗余的外层括号,直接写成
return ([i for i, j in enumerate(lst) if j / a <= 0.5] + [-1])[0]就能实现完全相同的效果。
内容的提问来源于stack exchange,提问作者Serp
相关产品推荐
相关产品推荐

