概要
Pythonのissubset
(イズサブセット)を使ってみたので、紹介。
issubset
とは、あるセットが他のセットの部分集合(すべての要素が他のセットに含まれている)であるかどうかをチェックするためのメソッド。
実際にコードを見てみるとわかりやすいです。
サンプルコード解説
# セットの定義
set1 = {1, 2, 3}
set2 = {1, 2, 3, 4, 5}
# set1がset2の部分集合であるかチェック
is_subset = set1.issubset(set2)
print(is_subset) # Trueを出力
上記の場合、set1
がset2
の部分集合であるかをチェックしています。
set1
の全ての要素がset2
に含まれているため、True
ですね。
リストに対して使用する場合はset()
を使う
# リストの定義
fruits_in_fridge = ['apple', 'banana', 'lemon', 'mango', 'grape']
fruits_for_dinner = set(['apple', 'lemon', 'grape'])
# セットがリストの部分集合であるかチェック
is_subset = fruits_for_dinner.issubset(fruits_in_fridge)
print(is_subset) # Trueを出力
上記のようにリストでも同様にチェックします。
一点、注意なのは、issubset()
はPythonのセット(set
)型のメソッドであり、リスト(list
)型には存在しません。そのため、リストに直接適用しようとすると以下のエラーになります。
AttributeError: 'list' object has no attribute 'issubset'
上記コードのように、セットの形にしてあげる必要があります。セットとは、重複する要素を持たず、順序も保持しない、データ型のこと。何度もprint
していると毎回中身の順番が異なることがわかります。
Python には、 集合 (set) を扱うためのデータ型もあります。集合とは、重複する要素をもたない、順序づけられていない要素の集まりです。
引用元:https://docs.python.org/ja/3/tutorial/datastructures.html#sets
この理由により、issubset()
はセットがハッシュベースのデータ構造であるため、要素の存在チェックが高速に行える、と言われています。
リストはセットに変換してあげると、集合の関数も使えるようになります。
上記のfruits_for_dinner
のタイプを出力すると<class 'set'>
と出てくるので、セットになっていることがわかりますね。
「空集合」の場合は、部分集合になる
ちなみに、以下のように、「空集合」の場合であっても、部分集合という結果になります。
fruits_in_fridge = ['apple', 'banana', 'lemon', 'mango', 'grape']
fruits_for_dinner = set([])
# セットがリストの部分集合であるかチェック
is_subset = fruits_for_dinner.issubset(fruits_in_fridge)
print(is_subset) # Trueを出力
部分集合ではない場合はFalse
を返す
以下のように部分集合にならないmelon
を対象にすると、もちろん結果はFalse
になります。
# リストの定義
fruits_in_fridge = ['apple', 'banana', 'lemon', 'mango', 'grape']
fruits_for_dinner = set(['melon'])
# セットがリストの部分集合であるかチェック
is_subset = fruits_for_dinner.issubset(fruits_in_fridge)
print(is_subset) # Falseを出力
辞書型に使う場合はキーに対してセットの操作を行う
辞書型には直接issubset()
を使用することはできませんが、辞書のキーに対してセットの操作を行うことは可能です。
# 辞書の定義
dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
# 辞書のキーのセットを取得
set1 = set(dict1.keys())
set2 = set(dict2.keys())
# set1がset2の部分集合であるかチェック
is_subset = set1.issubset(set2)
print(is_subset) # Trueを出力
上記のように、dict1
とdict2
のキーのセット({'a', 'c', 'b'}
)を取得し、その後でissubset()
メソッドを使用しています。
<=
演算子を使う
部分集合かどうかを確認するためには、以下のように<=
演算子を使うこともできます。
# セットの定義
set1 = {1, 2, 3}
set2 = {1, 2, 3, 4, 5}
print(set1 <= set2) # Trueを出力
参考: Djangoで活用できたケース
実際に使えたケースとしては、以下のような場合でした。
こちらはDjangoです。特定の条件でSampleModel
モデルから取得したデータの中に、期待したデータが含まれているか確認するというケースです。
list_fruit_cd = SampleModel.objects.filter(sample_cd__in=list_sample_cd).values_list('fruit_cd_id', flat=True)
if set(['xx', 'xxx', 'xxxx']).issubset(list_fruit_cd):
## 処理...