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

用前3个非None元素平均值替换列表None值(需大于对应列表元素)

问题:替换列表中的None值

原始数据

dataa = [11, 18, 84, 51, 82, 1, 19, 45, 83, 22]
datab = [1, None, 40, 45, None, None, 23, 24, None, None]

需求说明

替换datab中的所有None值,规则如下:

  • 仅当该位置前3个非None元素的平均值大于dataa对应位置的元素时,才将None替换为该平均值;
  • 若前序非None元素不足3个,直接保留None。

尝试过的代码

第一次尝试(存在报错问题)

直接取当前位置前3个元素计算平均值,但当前序元素包含None时会触发计算错误:

for i in range(len(dataa)):
        if (datab[i] == None):
                a = (datab[i-3]+datab[i-2]+datab[i-1])/3
                if ((datab[i-3]+datab[i-2]+datab[i-1])/3 > dataa[i]):
                        datab[i] = dataa[i]

第二次尝试(结果不符合预期)

尝试维护运行总计,但逻辑有误,导致部分场景处理不符合要求:

c = 0;
a = 0;
for i in range(len(dataa)):
        c = c + 1
        if (datab[i] == None):
                if (a > dataa[i]):
                        datab[i] = a
        else:
                if (c > 2):
                        a = (a * 3 + datab[i])/3

预期处理逻辑

  • 第1、2、3个元素:前序非None元素不足3个,保持原样;
  • 第5个元素(datab为None,dataa对应值82):前3个非None元素平均值为(1+40+45)/3 ≈28.66,不大于82,保留None;
  • 第6个元素(datab为None,dataa对应值1):前3个非None元素平均值28.66大于1,替换为该平均值;
  • 第9个元素(datab为None,dataa对应值83):前3个非None元素平均值为(28.66+23+24)/3≈25.22,不大于83,保留None;
  • 第10个元素(datab为None,dataa对应值22):前3个非None元素平均值25.22大于22,替换为该平均值。

正确实现代码

通过维护一个长度不超过3的队列,记录最近的非None元素,确保每次计算平均值时都是有效的前序非None元素:

dataa = [11, 18, 84, 51, 82, 1, 19, 45, 83, 22]
datab = [1, None, 40, 45, None, None, 23, 24, None, None]

# 保存最近3个非None元素的队列
recent_non_none = []

for idx in range(len(datab)):
    current_val = datab[idx]
    if current_val is not None:
        # 添加到队列,超过3个则移除最早的元素
        recent_non_none.append(current_val)
        if len(recent_non_none) > 3:
            recent_non_none.pop(0)
    else:
        # 检查是否有足够的前序非None元素
        if len(recent_non_none) >= 3:
            avg = sum(recent_non_none) / 3
            if avg > dataa[idx]:
                # 保留两位小数,与预期结果对齐
                datab[idx] = round(avg, 2)

print(datab)

预期输出

[1, None, 40, 45, None, 28.67, 23, 24, None, 25.22]

注:若需严格保留28.66而非四舍五入后的28.67,可将round(avg,2)改为float("{0:.2f}".format(avg)),实际计算值为86/3≈28.666...,四舍五入后为28.67。

内容的提问来源于stack exchange,提问作者James Risner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:15:31