Python实现移除所有被其他列表包含的子列表的方法
实现方案
需求梳理
给定嵌套列表:
[[8,7,5,6,8],[6,4,6,3],[4,6],[8,7,5,6],[7],[6,4,35]]
需要过滤后输出[[8,7,5,6,8],[6,4,35]],过滤规则为:删除所有作为连续子序列被其他任意子列表包含的子列表。
目前已有可直接调用的判断函数DNAoccursQ(w1, w2),作用是判断w1是否为w2的连续子序列,函数代码如下(注意原始代码缩进不规范,运行前需要调整为Python标准缩进格式):
def DNAoccursQ(w1,w2): if len(w1)==len(w2): i=0 while i<len(w1): if w1[i] != w2[i]: return False i+=1 return True elif len(w1)>len(w2): return False else: for i in range(len(w2)-1): if w2[i] != w1[0]: i+=1 else: p=i t=0 for t in range(len(w1)): if w1[t] == w2[p]: p += 1 t+=1 elif w1[t]!=w2[p]: return False return True return False
过滤逻辑
核心逻辑非常直接,两层遍历即可完成判断:
- 逐个取出嵌套列表中的每个子列表作为待检查项
- 将待检查项和列表中所有其他子列表逐一比对,调用
DNAoccursQ判断待检查项是否是其他子列表的连续子序列 - 如果待检查项被任意一个其他子列表包含,就标记为待删除;如果遍历完所有其他子列表都没有被包含,就保留该项
完整代码
def filter_nested_sublists(nested_list): result = [] for curr_idx, curr_sub in enumerate(nested_list): be_contained = False for cmp_idx, cmp_sub in enumerate(nested_list): # 跳过和自身的比对 if curr_idx == cmp_idx: continue # 调用已有函数判断是否被包含 if DNAoccursQ(curr_sub, cmp_sub): be_contained = True break if not be_contained: result.append(curr_sub) return result
测试验证
传入题目给出的测试用例执行:
test_data = [[8,7,5,6,8],[6,4,6,3],[4,6],[8,7,5,6],[7],[6,4,35]] print(filter_nested_sublists(test_data))
即可得到期望输出[[8,7,5,6,8],[6,4,35]]。
补充说明:如果运行结果和预期不符,优先检查
DNAoccursQ函数的匹配逻辑是否存在边界bug,比如短序列在长序列末尾匹配、长序列中存在多个匹配起始点的场景。
内容的提问来源于stack exchange,提问作者Rita
相关产品推荐
相关产品推荐

