如何修复Python中删除列表首尾及中间元素的函数运行问题
问题修正方案
现有代码的核心问题
- 函数名不符合要求,需求指定函数名为
chosen,当前命名为first - 冗余判断逻辑:题目已经明确输入列表长度始终为奇数,不需要额外处理偶数长度的分支
- 方法使用错误:
list.remove()是删除列表中第一个匹配传入值的元素,不是删除指定索引位置的元素,列表存在重复值时会出现逻辑错误,删除指定索引元素应该用pop()或者切片操作 - 动态长度导致索引计算错误:每删除一个元素后列表长度会变化,后续再计算中间索引时已经对应不上原列表的中间位置
- 类型注解不完整:要求参数和返回值的注解为
list[int],当前仅标注了list - 存在副作用:直接修改传入的原列表,会对外部调用方的原始数据产生影响,不符合纯函数的设计预期
最优实现方案
直接用切片操作实现,不会修改原列表,逻辑更简洁清晰:
def chosen(lst: list[int]) -> list[int]: mid = len(lst) // 2 # 拼接首元素后到中间元素前的片段,和中间元素后到尾元素前的片段 return lst[1:mid] + lst[mid+1:-1]
如果坚持用删除元素的逻辑实现,需要提前计算所有待删除的索引,并且从后往前删除避免索引偏移,同时复制原列表避免修改原始输入:
def chosen(lst: list[int]) -> list[int]: res = lst.copy() n = len(res) mid = n // 2 # 从后往前删,避免前面的删除操作影响后续索引的正确性 res.pop(-1) res.pop(mid) res.pop(0) return res
验证测试
- 输入
chosen([9,3,5,7,1]),返回[3,7],符合示例要求 - 输入
chosen([0,2,7,0,0,5,0,0,0]),返回[2,7,0,5,0,0],符合示例要求
内容的提问来源于stack exchange,提问作者jordan parker
相关产品推荐
相关产品推荐

