Python实现remove_all_before函数时如何正确处理空列表场景
问题
我始终无法找到正确的函数实现方式,以满足如下运行结果要求:
remove_all_before([],0) == []
我已经尝试使用bool()、len()以及if not等写法进行调试,但都没有生效。当前编写的实现代码如下:
from typing import Iterable def remove_all_before(items: list, border: int) -> Iterable: for x in list(items): if items: if items.count(border)>0: if x == border: return(items) else: items.remove(x) else: return(items) else: return(items)
回答
你当前的代码有几个核心逻辑问题:
- 遍历过程中直接对原列表做
remove()操作,会导致列表索引偏移,部分元素会被跳过,遍历结果不可靠 - 判断逻辑嵌套冗余且位置错误:传入空列表时
for循环不会执行,函数没有对应的返回分支,自然无法通过空列表测试用例 - 每次循环都调用
count()扫描全列表判断目标值是否存在,时间复杂度是O(n²),性能很差
不需要用边遍历边删除的思路实现,直接用列表内置方法定位目标值位置后切片即可,逻辑更简洁也能覆盖所有边界场景:
from typing import Iterable def remove_all_before(items: list, border: int) -> Iterable: try: # 查找目标值第一次出现的索引 first_index = items.index(border) except ValueError: # 目标值不存在直接返回原列表 return items # 从目标值位置开始切片返回 return items[first_index:]
这个实现可以直接通过所有测试场景:
- 空列表输入:
remove_all_before([], 0)会触发目标值不存在的分支,直接返回空列表,符合要求 - 目标值在列表中:会删除目标值第一次出现位置之前的所有元素,返回剩余部分
- 目标值不在列表中:直接返回原列表
- 目标值在列表首位:直接返回完整原列表
内容的提问来源于stack exchange,提问作者Albert Wijaya
相关产品推荐
相关产品推荐

