如何按指定元素集合将嵌套列表拆分为子嵌套列表?
问题描述
我有一个嵌套列表(实际数据更长):
master_list=[['foo', 'fum', 'A', 'fee', 5, 'see', 'V', 'G'],['B', 'foo', 'flo', 6, 'lee', 'D', 8, 9]]
需要将各子列表进一步拆分:若元素存在于指定集合elements中,连续的此类元素归为一个子嵌套列表;否则保留为单个元素。指定集合如下:
elements=['foo', 'fum', 5, 'flo', 'lee', 'D', 'V']
期望结果:
final_list=[[['foo', 'fum'], 'A', 'fee', [5], 'see', ['V'], 'G'],['B', ['foo', 'flo'], 6, ['lee', 'D'], 8, 9]]
我尝试了以下代码,但效果不佳:
final_list=[] for master in master_test: result = [] temp_list = [] for i in master: if i in cols: temp_list.append(i) result.append(temp_list) else: temp_list = [] result.append(i) result.append(temp_list) final_list.append(result)
问题分析
原代码的核心问题:
- 每次遇到指定元素就直接把
temp_list追加到result,导致重复添加(比如连续的foo和fum会让result里出现['foo']和['foo','fum']两次) - 循环结束后额外追加
temp_list,会导致空列表或多余的子列表混入结果 - 变量名不统一:原代码里用了
cols但实际应该是elements,master_test对应master_list
解决方案
正确的逻辑是:遍历元素时先收集连续的指定元素到临时列表,当遇到非指定元素或遍历结束时,再把临时列表(如果不为空)追加到结果,随后处理当前的非指定元素。
代码实现:
elements = {'foo', 'fum', 5, 'flo', 'lee', 'D', 'V'} # 用集合查询效率更高 master_list = [['foo', 'fum', 'A', 'fee', 5, 'see', 'V', 'G'], ['B', 'foo', 'flo', 6, 'lee', 'D', 8, 9]] final_list = [] for sublist in master_list: result = [] temp_group = [] for item in sublist: if item in elements: temp_group.append(item) else: # 先把之前收集的连续指定元素组加入结果 if temp_group: result.append(temp_group) temp_group = [] # 添加当前非指定元素 result.append(item) # 遍历结束后,检查是否还有未处理的指定元素组 if temp_group: result.append(temp_group) final_list.append(result) print(final_list)
代码说明
- 将
elements改为集合:集合的成员查询时间复杂度为O(1),比列表的O(n)更高效,尤其适合数据量大的场景 - 用
temp_group收集连续的指定元素,遇到非指定元素时先处理已收集的组,再添加当前元素 - 子列表遍历结束后必须检查
temp_group,避免遗漏最后一组连续的指定元素
运行后即可得到期望的final_list。
内容的提问来源于stack exchange,提问作者Robert Tuttle
相关产品推荐
相关产品推荐

