Python基于最近非空值填充嵌套列表空项的实现方法
嵌套列表空值按前序非空值填充方案
需求梳理
- 原始输入:二层嵌套列表
ogList = [['a'], ['b'], [], [], ['c'], ['d'], []](注:示例中a/b/c/d为字面量时需加字符串引号,否则会被识别为未定义变量) - 填充规则:遍历过程中遇到空的子列表,用它之前距离最近的非空子列表的内容填充
- 目标输出:
[['a'], ['b'], ['b'], ['b'], ['c'], ['d'], ['d']]
原代码问题说明
- 循环层级与变量命名错误
你的原始数据是二层嵌套结构(外层列表存子列表,子列表存单个元素),但你写了三层for循环,还反复用list作为循环变量名,既覆盖了Python内置的list类型,也和实际数据结构完全不匹配。 - 遍历中修改列表触发死循环
你在遍历子列表的循环内部调用insert/append修改当前正在遍历的列表,会让列表长度持续增加,for循环会不断遍历新插入的元素,直接导致程序卡死。 - 逻辑触发条件不成立
空列表本身没有元素,遍历空列表时内层循环根本不会执行,你写在最内层的空值判断逻辑永远不会被触发,自然没法完成空列表填充。 - 初始值设置不合理
你将存储前序值的copy变量初始化为0,如果列表开头就存在空列表,会错误填充数字0,不符合填充规则。
正确实现代码
版本1:生成新列表(不修改原列表,逻辑最直观)
ogList = [['a'], ['b'], [], [], ['c'], ['d'], []] outputList = [] last_valid = None # 记录最近一个非空子列表的内容 for sub in ogList: if sub: # 当前子列表非空,更新记录值,存入结果 last_valid = sub.copy() outputList.append(sub) else: # 当前为空列表,用记录的最近非空值填充 outputList.append(last_valid.copy()) print(outputList) # 运行结果:[['a'], ['b'], ['b'], ['b'], ['c'], ['d'], ['d']]
代码中用
copy()是因为列表是可变对象,直接存引用会导致多个子列表指向同一块内存,修改其中一个会联动修改所有同值子列表,如果不需要子列表独立,可以去掉copy直接赋值。
版本2:原地修改原列表
如果不需要保留原列表内容,可以直接按索引替换空列表,不需要额外生成新列表:
ogList = [['a'], ['b'], [], [], ['c'], ['d'], []] last_valid = None for index, sub in enumerate(ogList): if sub: last_valid = sub else: ogList[index] = last_valid.copy()
内容的提问来源于stack exchange,提问作者noah
相关产品推荐
相关产品推荐

