我有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。
答案 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。