LoginSignup
0
0

【Python】issubsetの使い方と注意点。サンプルコードで解説

Posted at

概要

Pythonのissubset(イズサブセット)を使ってみたので、紹介。

issubsetとは、あるセットが他のセットの部分集合(すべての要素が他のセットに含まれている)であるかどうかをチェックするためのメソッド。

実際にコードを見てみるとわかりやすいです。

サンプルコード解説

# セットの定義
set1 = {1, 2, 3}
set2 = {1, 2, 3, 4, 5}

# set1がset2の部分集合であるかチェック
is_subset = set1.issubset(set2)

print(is_subset)  # Trueを出力

上記の場合、set1set2の部分集合であるかをチェックしています。
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を出力

上記のように、dict1dict2のキーのセット({'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):
    ## 処理...
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0