如何在Python中移除列表列表中的超集列表?
解决Python嵌套列表中移除超集子列表的问题
这问题我之前也碰到过,其实核心就是判断每个子列表是不是另一个子列表的超集,然后把这类超集列表过滤掉就行。咱们一步步来:
思路分析
要移除的是那些包含另一个子列表所有元素,并且还有额外元素的超集列表。反过来想,我们要保留的是:不存在任何其他子列表,能让当前列表成为它的超集的那些列表。
用集合来处理超集判断是最方便的,因为Python的集合自带issuperset()方法,可以直接判断一个集合是否包含另一个集合的全部元素。
代码实现
直接上可运行的代码,你可以直接套用到你的场景里:
original_list = [[1,2,3],[2,3],[2,4,3],[4,5],[5]] # 先把每个子列表转成集合,方便后续超集判断 set_collection = [set(sublist) for sublist in original_list] result = [] for idx, current_set in enumerate(set_collection): # 标记当前列表是否是某个其他列表的超集 is_super_set = False for jdx, other_set in enumerate(set_collection): # 排除和自己比较的情况,并且确认当前集合是另一个的超集且不相等 if idx != jdx and current_set.issuperset(other_set) and current_set != other_set: is_super_set = True break # 如果不是超集,就保留原列表 if not is_super_set: result.append(original_list[idx]) print(result) # 输出: [[2,3],[5]]
代码解释
- 第一步把所有子列表转成集合:集合的超集判断比列表高效得多,尤其是当子列表元素比较多的时候。
- 双层循环遍历每个集合:和其他所有集合做对比,如果发现当前集合是另一个集合的超集(且两者不相等),就标记为需要移除的超集。
- 最后把不需要移除的原列表收集到结果里,这样就得到了你想要的输出。
补充说明
如果你的列表里有完全相同的子列表(比如[[2,3],[2,3]]),这段代码会保留所有相同的列表,因为它们互相不是超集(相等的集合满足issuperset但不满足current_set != other_set)。如果你需要去重,可以在最后对结果做个去重处理,比如用list(map(list, set(map(tuple, result)))),不过要注意元组是不可变的,转成集合去重后再转回列表就行。
内容的提问来源于stack exchange,提问作者apriori
相关产品推荐
相关产品推荐

