如何迭代集合列表执行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
相关产品推荐
相关产品推荐

