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

如何更简洁高效实现布尔列表中True后连续n个元素置True?

优化布尔列表滞后生效函数

需求说明

我有一个布尔列表:

l = [False, False, False, True, False, False, False]

需要将其转换为:

l_new = [False, False, False, True, True, True, False]

核心需求:当列表中出现True时,将该元素本身及后续指定数量(示例为2个)的元素都设为True。

原实现问题

我自己写了一个lagged_effect函数,但代码里处理迭代器跳过元素的逻辑非常繁琐,仅支持lag≤4的场景,而且存在隐藏bug(未将触发的True本身加入结果):

def lagged_effect(l, lag):
    l_new = []
    L_iter = iter(l)
    for elem in L_iter:
        if elem == True:
            l_new.extend([True]*lag)
            if lag == 1:
                next(L_iter)
            if lag == 2:
                next(L_iter)
                next(L_iter)
            if lag == 3:
                next(L_iter)
                next(L_iter)
                next(L_iter)
            if lag == 4:
                next(L_iter)
                next(L_iter)
                next(L_iter)
                next(L_iter)
            if lag > 4:
                print("not defined")
        if elem == False:
            l_new.append(False)
    return l_new
    print(l_new)
lagged_effect(l, lag=2)

优化方案

方案一:计数器跟踪生效状态(推荐)

用一个计数器跟踪需要持续设为True的次数,遍历一次列表即可完成转换,逻辑清晰且支持任意非负整数lag:

def lagged_effect(l, lag):
    l_new = []
    active_count = 0
    for elem in l:
        # 遇到True时,重置生效次数:当前元素+后续lag个
        if elem:
            active_count = lag + 1
        # 根据生效状态添加元素
        if active_count > 0:
            l_new.append(True)
            active_count -= 1
        else:
            l_new.append(elem)
    return l_new

# 测试验证
l = [False, False, False, True, False, False, False]
print(lagged_effect(l, lag=2))  # 输出: [False, False, False, True, True, True, False]

优势:

  • 时间复杂度O(n),遍历一次即可,效率最高
  • 无迭代器操作,逻辑直观易懂
  • 支持任意非负lag值,无上限限制
  • 修复了原代码未保留触发True的bug

方案二:迭代器简化跳过逻辑

如果偏好迭代器实现,用循环替代硬编码的next()调用,同时处理迭代器耗尽的异常:

def lagged_effect(l, lag):
    l_new = []
    it = iter(l)
    for elem in it:
        if elem:
            # 添加当前True和后续lag个True
            l_new.extend([True] * (lag + 1))
            # 跳过后续lag个元素,防止重复处理
            for _ in range(lag):
                try:
                    next(it)
                except StopIteration:
                    break  # 列表末尾时终止跳过
        else:
            l_new.append(elem)
    return l_new

# 测试验证
l = [False, False, False, True, False, False, False]
print(lagged_effect(l, lag=2))  # 输出正确结果

优势:

  • 解决了原代码next()重复编写的冗余问题
  • 支持任意lag值,添加异常处理避免报错
  • 保留迭代器遍历的思路

内容的提问来源于stack exchange,提问作者Fabian Pascher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:55:27