【Python】set.intersection() で『積集合』を取得するコード例

Python

Python の set.intersection() で『積集合せきしゅうごう』を求めるコード例です。

やり方です。

集合を入れたリストなどを、アスタリスク *アンパックして、set.intersection() に渡すとできました。

『リスト (list) に入れた集合』の積集合を計算するコード
set.intersection(*data_set_list)
『タプル (tuple) に入れた集合』の積集合を計算するコード
set.intersection(*data_set_tuple)
『辞書 (dict) に入れた集合』の積集合を計算するコード
set.intersection(*data_set_dict.values())

これで、『集合の数が不定ふていの場合』であっても、わずか1行で、柔軟に対応することができました。

集合が何個来ても大丈夫でした。

ところで、集合の数が2個とか3個とか、事前に決まっていた場合は、そのままひとつひとつ引数ひきすうに渡せば OK でした。

(例)set.intersection(集合1, 集合2, 集合3)

ですが、事前に集合の数がわからなかったときは、『アンパックして渡す』というアプローチが良かったです。

Python マニュアルの場所です。

(Python) class set([iterable]) set(集合)型

(Python) intersection(*others) インターセクション(積集合を求めるメソッド)

(Python) class list([iterable]) リスト型 (list)

(Python) class tuple([iterable]) タプル型 (tuple)

(Python) class dict(**kwarg) 辞書(マッピング型 — dict)

(Python) values() 辞書の値の新しいビューを返すメソッド

(Python) 引数リストのアンパック (unpack) * 演算子

位置引数: キーワード引数以外の引数。位置引数は引数リストの先頭に書くことができ、また * に続けた iterable の要素として渡すことができます。

(Python) argument | 用語集

リストの集合から積集合を求めるコード例

集合のリストを定義して、set.intersection()アンパックして渡します。

import pprint

print('# 『リスト (list) に入れた集合』の積集合を計算する方法')

data_set_list = [
    {'あ', 'い', 'う', 'え', 'お'},
    {'あ', 'う', 'お'},
    {'う', 'え', 'お'},
    {'a', 'i', 'う', 'e', 'お'},
]
pprint.pprint(data_set_list)

print('\n# リストをアンパック (*) して、set.intersection() に渡します。')

data_set = set.intersection(*data_set_list)
pprint.pprint(data_set)

print('End')

pprint.pprint() は、リストや辞書を見やすく表示してくれるメソッドです。

(Python) pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True)

実行結果

実行結果です。

# 『リスト (list) に入れた集合』の積集合を計算する方法
[{'え', 'う', 'あ', 'い', 'お'},
 {'う', 'あ', 'お'},
 {'う', 'え', 'お'},
 {'i', 'う', 'お', 'a', 'e'}]

# リストをアンパック (*) して、set.intersection() に渡します。
{'う', 'お'}
End

タプルの集合から積集合を求めるコード例

集合のタプルを定義して、set.intersection()アンパックして渡します。

import pprint

print('# 『タプル (tuple) に入れた集合』の積集合を計算する方法')

data_set_tuple = (
    {'あ', 'い', 'う', 'え', 'お'},
    {'あ', 'う', 'お'},
    {'う', 'え', 'お'},
    {'a', 'i', 'う', 'e', 'お'},
)
pprint.pprint(data_set_tuple)

print('\n# タプルをアンパック (*) して、set.intersection() に渡します。')

data_set = set.intersection(*data_set_tuple)
pprint.pprint(data_set)

print('End')

実行結果

実行結果です。

# 『タプル (tuple) に入れた集合』の積集合を計算する方法
({'え', 'う', 'あ', 'い', 'お'},
 {'う', 'あ', 'お'},
 {'う', 'え', 'お'},
 {'i', 'う', 'お', 'a', 'e'})

# タプルをアンパック (*) して、set.intersection() に渡します。
{'う', 'お'}
End

辞書の集合から積集合を求めるコード例

集合の辞書を定義して、.values() の部分を、set.intersection()アンパックして渡します。

import pprint

print('# 『辞書 (dict) に入れた集合』の積集合を計算する方法')

data_set_dict = {
    'key A': {'あ', 'い', 'う', 'え', 'お'},
    'key B': {'あ', 'う', 'お'},
    'key C': {'う', 'え', 'お'},
    'key D': {'a', 'i', 'う', 'e', 'お'},
}
pprint.pprint(data_set_dict)

print('\n# 辞書の .values() の内容')
print(data_set_dict.values())

print('\n# 辞書の .values() をアンパック (*) して、set.intersection() に渡します。')
data_set = set.intersection(*data_set_dict.values())
pprint.pprint(data_set)

print('End')

実行結果

実行結果です。

# 『辞書 (dict) に入れた集合』の積集合を計算する方法
{'key A': {'え', 'う', 'あ', 'い', 'お'},
 'key B': {'う', 'あ', 'お'},
 'key C': {'う', 'え', 'お'},
 'key D': {'i', 'う', 'お', 'a', 'e'}}

# 辞書の .values() の内容
dict_values([{'え', 'う', 'あ', 'い', 'お'}, {'う', 'あ', 'お'}, {'う', 'え', 'お'}, {'i', 'う', 'お', 'a', 'e'}])

# 辞書の .values() をアンパック (*) して、set.intersection() に渡します。
{'う', 'お'}
End

積集合の用途

積集合せきしゅうごうの使い道です。

  • キーワードリストから、共通のキーワードを抽出する。(積集合の結果が、共通のキーワードリストになりました。)
  • 転置てんちインデックスから、指定したキーワードを含む文書をリストアップする。(積集合の結果が、検索にヒットした文書リストになりました。)

自分は、こうした用途で、積集合を求める必要が出てきました。

そして、集合の数は、事前に決まっていないことがほとんどでした。

なので、リストや辞書をアンパックして、set.intersection() に渡すというアプローチが、とても重宝しました。

集合が2つとか3つとか、事前に分かっていたなら、& 演算子で 集合1 & 集合2 & 集合3 のように求めることができたんですけどね。

現実的には、『集合が何個くるかわからない』というケースが、ほとんどでした。

そんなときは、『アンパックして渡す』というアプローチが、とてもおすすめです。

たとえ引数ひきすうの数が不定ふていであっても、たったの1行で、柔軟に対応することができました。

スポンサーリンク
シェアする(押すとSNS投稿用の『編集ページ』に移動します)
フォローする(RSSフィードに移動します)
スポンサーリンク
シラベルノート
タイトルとURLをコピーしました