あるセットに別のセットが完全に含まれているかどうかをすばやく確認する方法はありますか?
何かのようなもの:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
回答:
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
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
セットが別のセットのサブセットであると疑われ、それらの2つのセットを交差させる場合、サブセットである場合、結果はそれ自体と等しくなります。
a = [2,1,3,3]
b = [5,4,3,2,1]
set(a).intersection(set(b)) == set(a)
>>True
A = set(a)
とB = set(b)
正気のために。次に、この比較は効率的にに還元できlen(A.intersection(B)) == len(A)
ます。つまり、セット自体を要素ごとに比較する必要はありません。これらのセットのカーディナリティのみを比較する必要があります。ただし、この最適化でさえ、このアプローチを望ましいものにするのにはおそらく不十分です。劇的に読みやすくかつ効率的にissubset()
と<=
アプローチはほぼ確実に何を誰もほしいですです。
以下の関数は、メインリストにサブリストが完全に含まれていない場合は0を返し、完全に含まれている場合は1を返します。
def islistsubset(sublist,mainlist):
for item in sublist:
if item in mainlist:
contains = 1
else:
contains = 0
break;
return contains
any(item in mainlist for item in sublist)
。