如何检查子集是否包含在列表中?及筛选符合指定子集要求的嵌套列表
如何筛选包含指定子集的嵌套列表元素
嘿,我来帮你搞定这个问题!你需要从嵌套列表里保留那些**同时包含l1=['s5','s6','s8']所有元素(每个至少出现一次)和l2=['s15','s23']所有元素(每个至少出现一次)**的子列表,对吧?
你提到用set(l1).issubset(t)的方式有顾虑,其实如果你的子集元素都是唯一的(就像l1和l2这样),这种方法完全够用——issubset只关心子列表有没有包含子集的所有元素,不管元素重复多少次。不过要是你的子集里有重复元素(比如l1=['s5','s5','s6'],要求子列表至少有2个s5),那集合的方法就失效了,因为集合会自动去重,没法验证重复元素的出现次数。
下面分两种情况给你解决方案:
情况1:子集元素无重复(你的当前需求)
这种场景下,用集合的issubset简单又高效,直接用列表推导式就能筛选:
l = [ ['s1', 's5', 's6', 's8', 's10', 's5', 's15', 's23'], ['s1', 's5', 's8', 's10', 's5', 's6', 's8', 's15', 's23'], ['s1', 's5', 's6', 's10', 's14', 's15', 's23'] ] l1 = ['s5','s6','s8'] l2 = ['s15', 's23'] # 先把子集转成集合,提升判断效率 set_l1 = set(l1) set_l2 = set(l2) # 筛选同时满足两个子集条件的子列表 result = [sub_list for sub_list in l if set_l1.issubset(sub_list) and set_l2.issubset(sub_list)] print(result)
运行这段代码后,输出就是你想要的结果:
[['s1', 's5', 's6', 's8', 's10', 's5', 's15', 's23'], ['s1', 's5', 's8', 's10', 's5', 's6', 's8', 's15', 's23']]
情况2:子集包含重复元素(扩展需求)
要是你以后遇到子集里有重复元素的情况(比如l1=['s5','s5','s6'],要求子列表至少有2个s5和1个s6),就需要统计元素出现次数来验证了,用collections.Counter很方便:
from collections import Counter l = [['s5','s5','s6','s8'], ['s5','s6','s8'], ['s5','s5','s5','s6']] l1 = ['s5','s5','s6'] counter_l1 = Counter(l1) result = [] for sub_list in l: counter_sub = Counter(sub_list) # 检查子集里每个元素的出现次数,都不超过子列表中的次数 if all(counter_sub[item] >= count for item, count in counter_l1.items()): result.append(sub_list) print(result) # 输出: [['s5','s5','s6','s8'], ['s5','s5','s5','s6']]
这种方法会严格校验每个元素的出现次数,能满足更复杂的筛选需求。
内容的提问来源于stack exchange,提问作者Fluxy
相关产品推荐
相关产品推荐

