2010-05-04 152 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

相關問題