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 の要素として渡すことができます。
リストの集合から積集合を求めるコード例
集合のリストを定義して、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() は、リストや辞書を見やすく表示してくれるメソッドです。
実行結果
実行結果です。
# 『リスト (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行で、柔軟に対応することができました。