2010-05-04 123 views

回答

83

这些都是名单,但如果你真的是集可以使用issubset方法。

>>> s = set([1,2,3]) 
>>> t = set([1,2]) 
>>> t.issubset(s) 
True 
>>> s.issuperset(t) 
True 

对于一个列表,你将无法比检查每个元素做得更好。

+3

我得到DEJAVU的一种奇怪的感觉,当我看到这个答案 – 2016-07-27 08:26:22

21

为了完整:这相当于issubset(虽然可以说是有点不太明确的/可读):

>>> set([1,2,3]) >= set([2,1]) 
True 
>>> set([1,2,3]) >= set([3,5,9]) 
False 
2

一种选择是保持不变 - 减:

>>> {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 
4

可能矫枉过正,但另一种变化: 如果相交两套,并将所得集包含候选人的所有独特的条目子集,那么候选集确实是一个子集。

换句话说: 如果所讨论的集合的基数等于由另一集合相交的集合的基数,那么它是该集合的子集。

a = [2,1,3,3] 
b = [5,4,3,2,1] 
set(a).intersection(set(b)) == set(a) 
>>True 
+0

让'A =集(一)'和'B =组(B)'的理智。然后这个比较可以有效地缩减为len(A.intersection(B))== len(A)'。也就是说,这些集合本身不需要进行元素比较;只需要比较这些集合的基数。但是,即使这种优化可能也不足以使这种方法更好。可读性更高的*和*高效的'issubset()'和'<='方法几乎可以肯定每个人都想要的。 – 2018-02-09 05:57:34

0

下面的函数返回0如果mainlist完全不包含子列表和1如果包含完整。

def islistsubset(sublist,mainlist): 
    for item in sublist: 
      if item in mainlist: 
        contains = 1 
      else: 
        contains = 0 
        break; 
    return contains 
+0

这是O(n^2),而在一些现有的答案中使用set操作要快得多。这也可以简单地写成'any(子列表中项目的主项目中的项目)'。 – Iguananaut 2017-10-25 12:09:22

+0

同意INFACT我也可以写 高清islistsubset(子表,mainlist): 包含项= 1 子列表: 如果mainlist项目: 继续 其他: 包含= 0 休息; 返回包含 因此每次调用只有2个分配 – 2017-10-26 13:04:30

+0

@BobinMottiThomas您可以直接返回True或False而不创建任何临时变量。 对于list_a中的项目: 如果项目不在list_b中: 返回False 返回True – 2017-10-26 15:17:31

0
>>> set([1,2,3]).issuperset(set([2,1])) 
True 
>>>  
>>> set([1,2,3]).issuperset(set([3,5,9])) 
False 
+2

考虑格式化您正确回答并添加一些说明。 – Sam 2018-01-26 08:56:34

相关问题