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

如何迭代集合列表执行issubset/issuperset判断并剔除冗余子集元素

集合列表去子集实现方案

原代码问题说明

你现有代码的统计逻辑是可用的:sum(j.issubset(b) for b in a) 统计的是当前集合j是列表中多少个元素的子集,每个集合一定是自身的子集,所以只要统计结果大于1,就说明j是其他至少一个集合的子集,需要移除。你只是没加对应的过滤逻辑,补充后即可生效:

a = [
    {'john-123'},
    {'john-123','john-234'},
    {'john-123','john-234','johnnybegood'}
]
result = []
for j in a:
    frequency = sum(j.issubset(b) for b in a)
    # 统计值为1说明没有其他超集,保留
    if frequency == 1:
        result.append(j)
print(result)
# 输出:[{'john-123', 'john-234', 'johnnybegood'}]

优化实现(大列表更高效)

如果列表中元素数量较多,上述遍历全列表的方案效率较低,可以先按集合长度降序排序,越长的集合越可能是超集,校验时仅和已保留的元素对比即可:

a = [
    {'john-123'},
    {'john-123','john-234'},
    {'john-123','john-234','johnnybegood'}
]
# 按集合元素个数从大到小排序
sorted_sets = sorted(a, key=lambda x: len(x), reverse=True)
result = []
for s in sorted_sets:
    # 仅需判断当前集合是不是已保留集合的子集
    if not any(s.issubset(kept_set) for kept_set in result):
        result.append(s)
print(result)
# 输出:[{'john-123', 'john-234', 'johnnybegood'}]

特殊场景适配

如果列表中存在两个完全相等的集合,上述逻辑会自动去重,仅保留一个:相等的集合互为子集,后遍历到的集合会被判定为已保留集合的子集,不会重复加入结果。

内容的提问来源于stack exchange,提问作者avnav99

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:30:04