Python:あるセットに別のセットが完全に含まれているかどうかを確認しますか?


86

あるセットに別のセットが完全に含まれているかどうかをすばやく確認する方法はありますか?

何かのようなもの:

>>>[1, 2, 3].containsAll([2, 1])
True

>>>[1, 2, 3].containsAll([3, 5, 9])
False

回答:


131

これらはリストですが、本当にセットを意味する場合は、issubsetメソッドを使用できます。

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

リストの場合、各要素をチェックするよりもうまくいくことはできません。


3
この答えを見ると、既視感が奇妙に感じられます
Christophe Roussy 2016

あなたは、の意味論を意識する必要はissubset()ないcontains()
wikier

37

完全をissubset期すために:これは次と同等です(ただし、おそらく少し明確で読みにくいです):

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

問題は=セット([])であり、B =セット([ ''、 'B'])をa.issubset(b)が真である
darkman

4

1つのオプションはそのままです-減算:

>>> {1, 2} - {1, 2, 3}
set([])
>>> {1, 2, 3} - {1, 2}
set([3])

基本的に、最初のリストのどの要素が2番目のリストにないかを確認します。

不足している値を表示できるので、非常に便利です。

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

set.issubset()またはset.issuperset()(またはそれらの演算子ベースの対応物:<=および>=)のいずれかを使用できます。メソッドは、セットだけでなく、引数として反復可能なものを受け入れることに注意してください。

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

4

セットが別のセットのサブセットであると疑われ、それらの2つのセットを交差させる場合、サブセットである場合、結果はそれ自体と等しくなります。

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

1
ましょうA = set(a)B = set(b)正気のために。次に、この比較は効率的にに還元できlen(A.intersection(B)) == len(A)ます。つまり、セット自体を要素ごとに比較する必要ありません。これらのセットのカーディナリティのみを比較する必要があります。ただし、この最適化でさえ、このアプローチを望ましいものにするのにはおそらく不十分です。劇的に読みやすくかつ効率的にissubset()<=アプローチはほぼ確実に何を誰もほしいですです。
セシルカレー

@CecilCurry True-長さの測定値であるため、「カーディナリティ」という単語を誤って使用しました。言葉遣いを更新しました。あなたの最適化は私のエラーに基づくエラーです。最適化ではありません。「intersection()」の文字通りの表現は、「> =」のオーバーロードされた意味よりも明確に読み取られ、「issubset()」が最も読みやすいと述べることは、最も一般的な答えであるため、明白なものを排除するようなものです。他の人の答えを繰り返すだけでなく、創造的な解決策を自由に提供してください。
ジョーダンステファネッリ

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

3
適切に答えをフォーマットし、説明を追加することを検討してください。
サム

0

以下の関数は、メインリストにサブリストが完全に含まれていない場合は0を返し、完全に含まれている場合は1を返します。

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

1
これはO(n ^ 2)ですが、既存の回答のいくつかのように集合演算を使用するとはるかに高速になります。これは簡単に書くこともできますany(item in mainlist for item in sublist)
iguananaut 2017年

事実に同意します。defislistsubset(sublist、mainlist):contains = 1 for item in sublist:if item in mainlist:continue else:contains = 0 break; リターンには、コールごとに2つの割り当てのみが含まれます
Bobin Motti Thomas

@BobinMottiThomas一時変数を作成せずに、TrueまたはFalseを直接返すことができます。list_a内のアイテムの場合:list_b内にないアイテムの場合:Falseを返すTrueを返す
Jordan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.