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
相关产品推荐
相关产品推荐

