You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:01:23