有沒有一種快速的方法來檢查一組是否完全包含另一組?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