如何在Python嵌套列表中实现fill down(向下填充)功能?
嵌套列表的向下填充(Fill Down)实现优化
问题描述
我有一个包含None值的嵌套列表a,需要执行向下填充操作——用前一行对应位置的非None值填充当前行的None。
输入列表a:
a = [ ['A','B','C','D'], [None,None,2,None], [None,1,None,None], [None,None,8,None], ['W','R',5,'Q'], ['H','S','X','V'], [None,None,None,7] ]
预期输出列表b:
b = [ ['A','B','C','D'], ['A','B',2,'D'], ['A',1,'C','D'], ['A','B',8,'D'], ['W','R',5,'Q'], ['H','S','X','V'], ['H','S','X',7] ]
我已经写出了可正常运行的代码,但想了解是否有更直接的纯列表实现方式(优先直接修改原列表a,不可行则生成新列表b),不需要依赖pandas的DataFrame转换。我的现有代码如下:
b = [] for z in a: if None in z: b.append([temp[i] if value == None else value for i, value in enumerate(z) ]) else: b.append(z) temp = z
优化实现方案
1. 直接修改原列表的方式
如果需要直接修改原列表a,可以从第二行开始遍历,用前一行的有效值覆盖当前行的None,同时实时更新填充用的缓存行:
# 初始化缓存为第一行的副本,避免修改原第一行时影响缓存 temp = a[0].copy() for i in range(1, len(a)): row = a[i] for j in range(len(row)): if row[j] is None: row[j] = temp[j] else: temp[j] = row[j]
执行后原列表a会直接变为预期的输出格式。
2. 生成新列表的简洁写法
若不想修改原列表,可简化逻辑——无需提前判断整行是否包含None,直接逐元素处理并更新缓存:
b = [] temp = [] for row in a: new_row = [] for idx, val in enumerate(row): if val is not None: new_val = val # 更新缓存对应位置,适配第一行初始化 if idx >= len(temp): temp.append(val) else: temp[idx] = val else: new_val = temp[idx] new_row.append(new_val) b.append(new_row)
这种写法逻辑连贯,自动处理全非None的行(此时会更新缓存为当前行的值),无需额外分支判断。
关于内置方法
Python标准库中没有专门针对嵌套列表的向下填充内置方法,上述遍历处理是最直接的纯列表实现方案,完全不需要依赖第三方库。
内容的提问来源于stack exchange,提问作者Rasec Malkic
相关产品推荐
相关产品推荐

