Python按空列表拆分嵌套列表:保留空列表并合并连续非空项
需求说明
给定原始嵌套列表 [[],[],['a'],['b'],[],[],['c'],['d'],['m']],处理规则为:
- 完整保留所有空列表的原有位置,不得挪动、删除空列表
- 将位置上连续出现的非空子列表中的所有元素,合并为单个子列表
- 最终要达成的目标结果为
[[],[],['a','b'],[],[],['c','d','m']]
原尝试代码的核心问题
目前写出的尝试逻辑存在明显偏差,无法输出预期结果,对应代码片段为:
my_temp = [] my_final = [] for item in my_array: if item != []: my_temp.append(item) else: my_final.append(my_temp); my_temp = [] print(my_final)
这段逻辑的问题点:
- 遇到空列表时,没有把空列表本身原封不动放到结果里,反而把临时存储的
my_temp整体当元素塞进去,从根上没做到“保留空列表原有位置”的要求 - 临时存储的操作是把整个非空子列表追加进去,不是把列表内的元素拿出平铺合并,就算逻辑跑顺,最后得到的也是多层嵌套的结构,不是要求的合并元素后的单层子列表
可行实现方案
按照规则逐一遍历原始列表元素,区分“空列表节点”和“连续非空段”两个分支处理即可:
- 遍历过程中遇到空列表时:如果当前有暂存的待合并非空元素,先把暂存的内容整合成列表追加到结果中,清空暂存区;再把当前遇到的空列表原封不动追加到结果里
- 遍历过程中遇到非空列表时:把当前列表里的所有元素全部塞进暂存容器,等遇到空列表或者整个列表遍历结束时,再把暂存容器统一结算成一个合并后的子列表
对应可直接运行的代码:
my_array = [[],[],['a'],['b'],[],[],['c'],['d'],['m']] my_final = [] pending_merge = [] # 暂存连续非空子列表的元素 for item in my_array: if item == []: # 遇到空列表时,先结算之前攒的非空内容 if pending_merge: my_final.append(pending_merge) pending_merge = [] # 原封不动保留当前的空列表位置 my_final.append(item) else: # 非空列表就把里面的元素全部加到暂存区 pending_merge.extend(item) # 遍历结束后,处理最后一段没遇到空列表的剩余暂存内容 if pending_merge: my_final.append(pending_merge) print(my_final)
代码运行后输出完全匹配目标结果 [[], [], ['a', 'b'], [], [], ['c', 'd', 'm']]。
内容的提问来源于stack exchange,提问作者santoku
相关产品推荐
相关产品推荐

