Python如何移除嵌套列表中元素被其他子列表包含的重复子列表
需求说明
给定嵌套列表,删除所有元素完全被其他子列表包含的子列表,保留元素覆盖范围更大的子列表。
- 示例输入
lists=[[2], [3], [4, 5, 6], [7], [8], [9], [9, 10, 11], [10]]
- 示例输出
lists=[[2], [3], [4, 5, 6], [7], [8], [9, 10, 11]]
实现思路
核心通过集合的子集判断完成筛选,避免逐元素比对的冗余逻辑:
- 预将所有子列表转为集合类型,降低子集判断的时间复杂度
- 逐一遍历每个子列表,检查是否存在非自身的其他子列表,能完全覆盖当前子列表的所有元素
- 不存在覆盖关系的子列表直接保留,存在覆盖关系的子列表直接剔除
可运行代码
# 原始输入列表 lists = [[2], [3], [4, 5, 6], [7], [8], [9], [9, 10, 11], [10]] # 预生成每个子列表对应的集合,避免重复转换 sub_sets = [set(item) for item in lists] res = [] for index, sub_list in enumerate(lists): current_set = sub_sets[index] remove_flag = False # 和其他所有子列表做覆盖比对 for cmp_index, cmp_set in enumerate(sub_sets): if index == cmp_index: continue # 如果当前子列表所有元素都在对比的子列表中,标记为待删除 if current_set.issubset(cmp_set): remove_flag = True break if not remove_flag: res.append(sub_list) print(res) # 输出结果:[[2], [3], [4, 5, 6], [7], [8], [9, 10, 11]]
补充说明
如果业务场景中存在多个完全相同的子列表(比如两个[9,10,11]),上述代码会因为两个列表互为子集将其全部剔除,遇到这种场景可以额外增加判断规则:只有当当前子列表长度小于对比子列表,或者长度相等但索引更大的时候才判定为被覆盖,就能保留符合要求的长列表。
内容的提问来源于stack exchange,提问作者ankerbow
相关产品推荐
相关产品推荐

