Python列表左移函数修复:仅移除开头目标值并保留中间值
修复自定义列表lstrip方法的问题
需求说明
需要实现一个类似list.lstrip(target_value, fill_value)的Python列表方法,满足以下要求:
- 仅当列表开头存在目标值时,将元素左移
- 保留列表中间的目标值
- 末尾用指定值填充空缺
示例列表
list1 = ['N/A', 'a', 'b', 'c'] list2 = [None, None, 'd', None, 'e']
现有问题代码
原实现会移除所有目标值,无法保留列表中间的目标值:
def lstrip(a_list, target_value=None, fill_value='Invalid'): if a_list[0] != target_value: return a_list else: result = [] for element in a_list: if element != target_value: result.append(element) return result + [fill_value]*(len(a_list) - len(result))
当前输出
print(lstrip(list1, 'N/A')) ['a', 'b', 'c', 'Invalid'] print(lstrip(list2)) ['d', 'e', 'Invalid', 'Invalid', 'Invalid']
期望输出
对于list2,期望输出为:['d', None, 'e', 'Invalid', 'Invalid']
修复后的代码
def lstrip(a_list, target_value=None, fill_value='Invalid'): # 处理空列表的边界情况 if not a_list: return a_list # 定位开头连续目标值的结束位置 start_idx = 0 while start_idx < len(a_list) and a_list[start_idx] == target_value: start_idx += 1 # 若开头无目标值,返回原列表的副本(避免修改原列表) if start_idx == 0: return a_list.copy() # 截取非开头目标值的部分,填充至原列表长度 stripped_elements = a_list[start_idx:] fill_num = len(a_list) - len(stripped_elements) return stripped_elements + [fill_value] * fill_num
代码说明
- 新增空列表判断,避免索引越界
- 通过循环仅定位开头连续的目标值,不会影响列表中间的目标值
- 截取第一个非目标值开始的子列表,保证中间元素完整保留
- 计算需要填充的元素数量,将指定值补充至原列表长度
内容的提问来源于stack exchange,提问作者VERBOSE
相关产品推荐
相关产品推荐

