Pythonで複数のデータを扱う際、重複を取り除いたり、「AにもBにも含まれるデータ」「AまたはBに含まれるデータ」といった集合演算を行いたい場面は頻繁に訪れます。
Pythonには標準で強力な set 型が用意されており、これを使えば数学的な集合演算を直感的かつ高速に行うことができます。
この記事では、Pythonの set を使った和集合の求め方について、基本的な | 演算子と union() メソッドの使い分けから、リスト(list)や辞書(dict)との連携、さらには差集合や積集合といった関連知識まで、最新情報に基づいて徹底解説します。
![]() 執筆者:マヒロ |
|
Pythonのset(集合)における和集合とは?
和集合(Union)とは、2つ以上の集合の「少なくともどちらか一方に含まれている要素」をすべて集めた新しい集合のことです。
重複する要素は自動的に1つにまとめられるのが特徴です。
例えば、集合A {1, 2, 3} と 集合B {3, 4, 5} の和集合は、{1, 2, 3, 4, 5} となります。
和集合を求める2つの方法
Pythonで和集合を求めるには、主に以下の2つの方法があります。
- パイプ演算子
|を使う union()メソッドを使う
それぞれの特徴と使い分けを詳しく見ていきましょう。
パイプ演算子 | を使って和集合を求める
最も直感的でコードが短くなるのが、パイプ演算子 | を使う方法です。 数学の記号に近い感覚で記述できます。
# 2つのセットを定義
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
# | 演算子で和集合を求める
result = set_a | set_b
print(f"set_a: {set_a}")
print(f"set_b: {set_b}")
print(f"和集合: {result}")
実行結果
set_a: {1, 2, 3, 4}
set_b: {3, 4, 5, 6}
和集合: {1, 2, 3, 4, 5, 6}
set_a | set_b と記述することで、両方の集合に含まれるすべての要素を持つ新しいセット result が生成されます。
共通していた 3 と 4 は重複することなく、1つずつ含まれている点に注目してください。
3つ以上の集合でも同様に使える
演算子はチェーン(連結)させることができるため、3つ以上の集合を統合する際も簡単です。
set_a = {1, 2}
set_b = {2, 3}
set_c = {3, 4}
# 3つの和集合
result = set_a | set_b | set_c
print(result)
実行結果
{1, 2, 3, 4}
union() メソッドを使って和集合を求める
もう一つの方法は、set 型が持っている union() メソッドを使うことです。
機能は | 演算子とほぼ同じですが、引数にリストやタプルなど、set以外のイテラブル(繰り返し可能オブジェクト)を直接渡せるという強力なメリットがあります。
set_a = {1, 2, 3}
list_b = [3, 4, 5] # これはリスト
# unionメソッドならリストをそのまま渡せる
result = set_a.union(list_b)
print(result)
実行結果
{1, 2, 3, 4, 5}
set_a.union(list_b) のように記述します。
もしこれを set_a | list_b と書くと、TypeError (型エラー)が発生します。
演算子 | は両辺が set でなければならないという制約があるためです。
変換の手間を省きたい場合は、union() メソッドが便利です。
リスト(list)や辞書(dict)での和集合テクニック
実務では、データが最初から set で用意されているとは限りません。
リストや辞書を扱う際の和集合テクニックを紹介します。
リスト同士の和集合を求める
リスト同士の和集合を求めたい場合は、一度 set に変換してから演算を行い、必要であれば再度 list に戻すのが一般的です。
list_a = [1, 2, 3, 3] # 重複あり
list_b = [3, 4, 5]
# setに変換して和集合をとり、listに戻す
result_list = list(set(list_a) | set(list_b))
print(result_list)
実行結果
[1, 2, 3, 4, 5]
set(list_a) でリストを集合に変換し、重複を排除しつつ | 演算子を使える状態にします。
計算結果も set なので、最後に list() でリスト型に戻しています。
注意点:順序について
set は順序を持たないデータ構造であるため、list に戻した際に元のリストの要素順序は保持されません。
順序が重要な場合は dict.fromkeys() を使うなどの工夫が必要です。
辞書(dict)のキーの和集合
辞書型の場合、.keys() メソッドを使わなくても、辞書オブジェクトそのものがキーの集合のように振る舞います(Python 3.x以降)。
dict_a = {'apple': 100, 'banana': 200}
dict_b = {'banana': 250, 'orange': 300}
# 辞書のキー同士の和集合
# .keys()を使うことで、キーの集合演算であることを明確にする
keys_union = dict_a.keys() | dict_b.keys()
print(keys_union)
実行結果
{'apple', 'banana', 'orange'}
辞書のキー(dict_keysオブジェクト)はセットライクな動作をするため、そのまま | 演算子が使用できます。
これにより、2つの辞書に含まれる全種類のキーを簡単に取得できます。
※補足:Python 3.9以降の辞書結合について
Python 3.9以降では、辞書に対して | 演算子を使うと「辞書のマージ(結合)」機能として動作します(例: dict_a | dict_b)。
この場合、キーだけでなく値も含めた新しい辞書が返されます。
単に「キーの種類」だけを集合として扱いたい場合は、上記のように .keys() を明示的に使うことで、意図しない辞書の結合を防ぎ、コードの意図を明確にすることができます。
和集合以外の集合演算(積集合・差集合・対称差集合)
和集合と合わせて覚えておきたい、その他の主要な集合演算についても簡単に触れておきます。
| 名称 | 記号 | メソッド | 説明 |
|---|---|---|---|
| 和集合 | | |
union |
A または B に含まれる |
| 積集合 | & |
intersection |
A かつ B に含まれる(共通部分) |
| 差集合 | - |
difference |
A に含まれ、B に含まれない |
| 対称差集合 | ^ |
symmetric_difference |
A か B のどちらか一方だけに含まれる |
実装例
A = {1, 2, 3}
B = {3, 4, 5}
print(f"積集合 (A & B): {A & B}")
print(f"差集合 (A - B): {A - B}")
print(f"対称差 (A ^ B): {A ^ B}")
実行結果
積集合 (A & B): {3}
差集合 (A - B): {1, 2}
対称差 (A ^ B): {1, 2, 4, 5}
updateメソッドによる破壊的変更
ここまでは「新しい集合」を作成して返す方法でしたが、既存の集合に別の集合の要素を追加して更新したい場合は update() メソッド(または |= 演算子)を使用します。
set_a = {1, 2}
set_b = {3, 4}
# set_a 自体を書き換える(破壊的変更)
set_a.update(set_b)
print(set_a)
実行結果
{1, 2, 3, 4}
set_a そのものが変更され、set_b の要素が取り込まれました。
メモリ効率を考える場合や、変数を再利用したい場合に有効です。
Pythonのスキルを活かして年収を上げる方法
以上、Pythonで、setで和集合を求める方法について解説してきました。
なお、Pythonのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。
Pythonエンジニアの需要は非常に高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなPythonの案件を探しやすくなります。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。



