有没有一种快速的方法来检查一组是否完全包含另一组?Python:看看一个集合是否完全包含另一个集合?
喜欢的东西:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
有没有一种快速的方法来检查一组是否完全包含另一组?Python:看看一个集合是否完全包含另一个集合?
喜欢的东西:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
这些都是名单,但如果你真的是集可以使用issubset方法。
>>> s = set([1,2,3])
>>> t = set([1,2])
>>> t.issubset(s)
True
>>> s.issuperset(t)
True
对于一个列表,你将无法比检查每个元素做得更好。
为了完整:这相当于issubset
(虽然可以说是有点不太明确的/可读):
>>> set([1,2,3]) >= set([2,1])
True
>>> set([1,2,3]) >= set([3,5,9])
False
一种选择是保持不变 - 减:
>>> {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
可能矫枉过正,但另一种变化: 如果相交两套,并将所得集包含候选人的所有独特的条目子集,那么候选集确实是一个子集。
换句话说: 如果所讨论的集合的基数等于由另一集合相交的集合的基数,那么它是该集合的子集。
a = [2,1,3,3]
b = [5,4,3,2,1]
set(a).intersection(set(b)) == set(a)
>>True
让'A =集(一)'和'B =组(B)'的理智。然后这个比较可以有效地缩减为len(A.intersection(B))== len(A)'。也就是说,这些集合本身不需要进行元素比较;只需要比较这些集合的基数。但是,即使这种优化可能也不足以使这种方法更好。可读性更高的*和*高效的'issubset()'和'<='方法几乎可以肯定每个人都想要的。 – 2018-02-09 05:57:34
下面的函数返回0如果mainlist完全不包含子列表和1如果包含完整。
def islistsubset(sublist,mainlist):
for item in sublist:
if item in mainlist:
contains = 1
else:
contains = 0
break;
return contains
这是O(n^2),而在一些现有的答案中使用set操作要快得多。这也可以简单地写成'any(子列表中项目的主项目中的项目)'。 – Iguananaut 2017-10-25 12:09:22
同意INFACT我也可以写 高清islistsubset(子表,mainlist): 包含项= 1 子列表: 如果mainlist项目: 继续 其他: 包含= 0 休息; 返回包含 因此每次调用只有2个分配 – 2017-10-26 13:04:30
@BobinMottiThomas您可以直接返回True或False而不创建任何临时变量。 对于list_a中的项目: 如果项目不在list_b中: 返回False 返回True – 2017-10-26 15:17:31
>>> set([1,2,3]).issuperset(set([2,1]))
True
>>>
>>> set([1,2,3]).issuperset(set([3,5,9]))
False
考虑格式化您正确回答并添加一些说明。 – Sam 2018-01-26 08:56:34
我得到DEJAVU的一种奇怪的感觉,当我看到这个答案 – 2016-07-27 08:26:22