Pythonで集合の演算を行う #python

Pythonの集合型(set)を使った演算処理を紹介します。
2020.08.27

こんにちは、クラスメソッドの岡です。

最近チームでyukicoder会を実施していて、その際にpythonで集合の演算がとてもシンプルに書けることを知ったので備忘録的に使い方をまとめておきます。

Pythonのデータ型として集合を扱うset型が用意されているので、set型での集合演算をご紹介します。

動作確認環境

$ python --version
Python 3.8.5

和集合

x か y に含まれる

演算子(|)

x = {'A', 'B', 'C'}
y = {'C', 'D'}

x | y
>>> {'A', 'D', 'C', 'B'}

set型は順序を持たないので結果は順不同となります。

union

x = {'A', 'B', 'C'}
y = {'C', 'D'}

x.union(y)
>>> {'A', 'D', 'C', 'B'}

union関数を使っても同じ結果になります。

更新

元のset型を更新したい場合は |= もしくは update() で更新できます。

x |= y
# x = {'A', 'D', 'C', 'B'}

x.update(y)

積集合

x と y で共通に含まれる

演算子(&)

x = {'A', 'B', 'C'}
y = {'C', 'D'}

x & y
>>> {'C'}

intersection

x = {'A', 'B', 'C'}
y = {'C', 'D'}

x.intersection(y)
>>> {'C'}

更新

&= もしくは intersection_update()

x &= y
# x = {'C'}

x.intersection_update(y)

差集合

x にのみ含まれる(y にのみ含まれる)

演算子(-)

x = {'A', 'B', 'C'}
y = {'C', 'D'}

x - y
>>> {'A', 'B'}

y - x
>>> {'D'}

difference

x = {'A', 'B', 'C'}
y = {'C', 'D'}

x.difference(y)
>>> {'A', 'B'}

更新

-= もしくは difference_update()

x -= y
# x = {'C'}

x.difference_update(y)

対象差集合

x もしくは yにのみ含まれる

演算子(^)

x = {'A', 'B', 'C'}
y = {'A', 'B', 'C', 'D'}

x ^ y
>>> {'D'}

symmetric_difference

x = {'A', 'B', 'C'}
y = {'A', 'B', 'C', 'D'}

x.symmetric_difference(y)
>>> {'D'}

更新

^= もしくは symmetric_difference_update()

x ^= y
# x = {'D'}

x.symmetric_difference_update(y)

おまけ

引数はset型じゃなくてもOK

ちなみに上記の演算子ではなく関数で計算する場合、引数にリストやタプルを渡しても内部でよしなに変換して計算してくれます。

x = {'A', 'B', 'C'}
y = ['C', 'D']

x.union(y)
>>> {'A', 'D', 'C', 'B'}

めっちゃ親切。。

集合内包表記

リストと同じように、内包表記で集合を生成することもできます。

{i for i in range(10)}
>>> {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}