查找集合(具有元素的副本)是python中更大集合的子集

时间:2020-02-12 20:29:39

标签: python set subset

我有2组a = [3,4,5,5] b = [3,4,5,6,7,8,9] 我们必须找到a是否是b的子集?

a=[3,4,5,5] 
b=[3,4,5,6,7,8,9]
if(set(a).issubset(set(b))): 
    print('yes')
else:
    print('no')

此代码显示是,因为它忽略了元素的副本,例如:它认为5在集合'a'中仅出现一次

我希望答案为“否”,因为b只有一个5。

3 个答案:

答案 0 :(得分:1)

如果必须在没有库的情况下执行此操作,并且列表已排序,则可以使用迭代器执行匹配。当值相同时,在前进第二组的同时前进第一组。您将知道,如果您遍历所有列表(使用迭代器),则它是第二个列表的子集

 Session {
   cookie: {
     path: '/',
     _expires: 2020-02-12T22:25:18.336Z,
     originalMaxAge: 7200000,
     httpOnly: true,
     sameSite: true,
     secure: false
   },
   name: 'John'
 }

如果不能保证对列表进行排序,则可以在函数开头通过添加以下内容对其进行排序:

def isSubset(setA,setB):
    iterA  = iter(setA)
    valueA = next(iterA,None)
    for valueB in setB:
        if valueA == valueB:
            valueA = next(iterA,None)
    return valueA is None

a=[3,4,5,5] 
b=[3,4,5,6,7,8,9]
print(isSubset(a,b)) # False

c=[3,4,5,5,5,6,7,8,9]
print(isSubset(a,c)) # True  

d=[3,4,5,5,5,6,7]
print(isSubset(b,d)) # False  

如果您想更快地执行此操作,则可以添加一个条件,以在到达setA结束时或set B中的值大于set A的当前值时退出循环:

setA,setB = sorted(setA),sorted(setB)

答案 1 :(得分:0)

5在a中发生两次,但在set(a)中发生一次。 set(a)=(3,4,5)set(b)=(3,4,5,6,7,8,9),因此答案是正确的。

答案 2 :(得分:0)

使用collections.Counter

all(v >= 0 for v in (Counter(b) - Counter(a)).values())

如果a是b的子包,则为True。