You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:30:53