有没有一种快速的方法来检查一组是否完全包含另一组?
就像是:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
Answers:
这些是列表,但是如果您的意思是集合,则可以使用issubset方法。
>>> s = set([1,2,3])
>>> t = set([1,2])
>>> t.issubset(s)
True
>>> s.issuperset(t)
True
对于列表,将无法比检查每个元素做得更好。
issubset()
not的语义contains()
一个选项保持不变-减法:
>>> {1, 2} - {1, 2, 3}
set([])
>>> {1, 2, 3} - {1, 2}
set([3])
基本上,您检查第一个列表中的哪些元素不在第二个列表中。
我发现它非常方便,因为您可以显示缺少的值:
>>> def check_contains(a, b):
... diff = a - b
... if not diff:
... # All elements from a are present in b
... return True
... print('Some elements are missing: {}'.format(diff))
... return False
...
>>> check_contains({1, 2}, {1, 2, 3})
True
>>> check_contains({1, 2, 3}, {1, 2})
Some elements are missing: set([3])
False
您可以使用set.issubset()
或set.issuperset()
(或基于其运算符的对应项:<=
和>=
)。请注意,这些方法将接受任何iterable作为参数,而不仅仅是一个set:
>>> {1, 2}.issubset([1, 2, 3])
True
>>> {1, 2, 3}.issuperset([1, 2])
True
但是,如果使用运算符,则必须设置两个参数:
>>> {1, 2} <= {1, 2, 3}
True
>>> {1, 2, 3} >= {1, 2}
True
如果您怀疑一个集合是另一个集合的子集,并且将这两个集合相交,则如果它是一个子集,则结果等于自身。
a = [2,1,3,3]
b = [5,4,3,2,1]
set(a).intersection(set(b)) == set(a)
>>True
A = set(a)
和B = set(b)
为理智。然后,该比较有效地简化为len(A.intersection(B)) == len(A)
。也就是说,本身需要的集不相比较逐元素; 仅需要比较这些集合的基数。但是,即使是这种优化也可能不足以使该方法更可取。将大大更具可读性和高效issubset()
和<=
方法几乎肯定是每个人都想要的。
如果主列表未完全包含子列表,则函数下方返回0,如果完全包含子列表,则返回1。
def islistsubset(sublist,mainlist):
for item in sublist:
if item in mainlist:
contains = 1
else:
contains = 0
break;
return contains
any(item in mainlist for item in sublist)
。