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

Python元组列表优化:无需二次遍历过滤无效子列表的方案

一次遍历完成分组与无效子列表过滤

需求说明

给定元组列表:

values = [('on',1),('e1',2),('e2',3),('on',4),('on',5),('e1',6),('e2',7),('on',8),
         ('off',9),('e1',10),('e2',11),('on',12)]

需要生成符合以下规则的子列表集合:

  • 从第一个'on'元组开始收集元素,直到遇到下一个'on'元组,组成一个子列表
  • 排除包含'off'后接'on'的无效子列表

期望输出:

[('on',1),('e1',2),('e2',3),('on',4)],
[('on',5),('e1',6),('e2',7),('on',8)]

原代码需要二次遍历过滤无效子列表,以下是一次遍历即可完成分组与过滤的实现方案:

优化后的代码

values = [('on',1),('e1',2),('e2',3),('on',4),('on',5),('e1',6),('e2',7),('on',8),
         ('off',9),('e1',10),('e2',11),('on',12)]

result = []
current_group = []
has_off = False

for item in values:
    key, _ = item
    if key == 'on':
        if current_group:
            # 遇到结束标记的'on',检查当前分组是否有效
            if not has_off:
                result.append(current_group + [item])
            # 重置分组状态,准备下一轮收集
            current_group = []
            has_off = False
        else:
            # 启动新分组,加入第一个'on'
            current_group.append(item)
    elif key == 'off':
        # 标记当前分组无效,后续即使遇到'on'也不会加入结果
        has_off = True
        if current_group:
            current_group.append(item)
    else:
        # 仅在有效收集状态下,加入非'on'/'off'元素
        if current_group and not has_off:
            current_group.append(item)

# 输出结果
for group in result:
    print(group)

逻辑说明

  • 用current_group维护正在收集的子列表,has_off标记当前分组是否出现过'off'
  • 第一个'on'触发新分组的启动,开始收集后续元素
  • 再次遇到'on'时:若当前分组无'off',则将完整分组存入结果,随后重置状态准备下一轮
  • 遇到'off'直接标记分组无效,后续该分组不会被纳入结果
  • 非'on'/'off'的元素,仅在有效收集状态下才被加入分组
  • 全程仅遍历一次原列表,无需后续二次过滤操作

内容的提问来源于stack exchange,提问作者blue-sky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:15:34