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

