You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python技术问询:解析移除列表每隔一个元素的代码实现逻辑

解析Python移除每隔一个元素的列表推导式代码

嘿,我来帮你拆解这段代码的工作原理,顺便把你的三个疑问一一讲清楚!

首先先把代码贴出来方便对照:

def remove_every_other(lst):
    return [val for i,val in enumerate(lst) if i % 2 == 0]

print(remove_every_other([1,2,3,4,5]))  # 输出: [1,3,5]

这段代码的核心是用列表推导式结合enumerate()函数,生成一个只保留原列表中索引为偶数(从0开始计数)的元素的新列表。正如你所说,enumerate(lst)会把原列表的每个元素和它的索引打包成元组,比如[1,2,3,4,5]会被转换成(0,1), (1,2), (2,3), (3,4), (4,5)这样的元组序列,接下来就逐个处理这些元组。


核心疑问解答

1. 返回语句中为何在for循环前后都出现'val'?

这是列表推导式的标准语法逻辑!列表推导式的基本结构是:[要存入新列表的内容 for 循环变量 in 可迭代对象 if 过滤条件]。这里的逻辑是:遍历enumerate生成的每个元组,把符合条件的元素值收集起来。

  • 后面的val是从元组里解构出来的变量,用来接收原列表的元素值;
  • 前面的val是我们要放进新列表的内容,意思是“把这次循环里拿到的val,如果符合条件就加到新列表里”。

两者是同一个变量的不同用法,前面是输出项,后面是循环里的变量名。

2. for后的'i'是否对应enumerate生成元组的索引0?

完全正确!enumerate()生成的每个元组,第一个位置就是元素的索引值(从0开始计数)。这里用i来接收这个索引,所以它对应的就是元组里索引0的位置,比如第一个元组(0,1)里的0就会赋值给i。

3. for后的'val'是否对应enumerate生成元组的索引1?

没错!enumerate()生成的元组第二个位置就是原列表里的实际元素值,这里用val来接收这个值,所以它对应的就是元组里索引1的位置,比如第一个元组(0,1)里的1就会赋值给val。


最后再梳理一遍整体逻辑:遍历带索引的元素,通过i % 2 == 0筛选出索引为偶数的元素,把这些元素的val收集起来组成新列表,所以原列表[1,2,3,4,5]里索引0、2、4的元素1、3、5被保留,最终输出[1,3,5]。

内容的提问来源于stack exchange,提问作者Johnathan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:32:46