【Python】set型(集合型)とは?使い方について解説!
(*このページは2021年1月13日に更新されました。)
Pythonのset型とは集合を扱うための型であり、リスト(List)のように、複数の値を格納できるミュータブルな型となります。
その為、リストと同じように使用できると思いますが、set型はインデックスが付与されていなかったり、重複する要素があっても1つの要素として扱うなど、set型には規則がありますので使用する際は注意してください。
そして、set型は要素を追加したり、削除したりするような基本的な使い方から要素をまとめて取り出すような応用的な使い方だけでなく、set型同士で和集合や積集合のような集合計算を行うことができます。
また、frozenset()を使用すると、set型でタプルのような要素の追加、削除など操作ができないイミュータブルな型を作成することもできます。
今回はPythonのset型(集合型)の使い方について以下の内容で解説していきます。
⚫︎ set型(集合型)とは
⚫︎ set型(集合型)の基本的な使い方
⚫︎ set型(集合型)の応用的な使い方
⚫︎ set型で集合演算を行う
⚫︎ set型でイミュータブルな型を作成する方法
set型(集合型)とは
Pythonのset型とは集合を扱うための型であり、複数の値を格納できる型になります。
set型の書き方
set型の書き方は下記となります。
1 |
set型変数 = {値1, 値2, 値3, ...} |
set型変数を定義し、値を「{}(波括弧)」で囲むことでset型を作成することができます。
set型を使用する際の注意点
set型を使用する際に以下のような注意すべき点があります。
⚫︎ 要素にインデックスが付与されない:
set型はリストやタプルと違って要素にインデックスが付与されません。
その為、変数[0]のようにインデックスを指定して要素を操作するとエラーになります。
例
1 2 3 |
sample_set = {'value1', 'value2','value3', 'value4'} sample_set[2] = 'value10' # TypeError: 'set' object does not support item assignment |
⚫︎ どの値も一つのだけ要素として格納することができる:
リストやタプルは同じ要素を何個も格納して扱うことができますが、set型は同じ値を何個も格納しても1つの要素として扱われるようになります。
例
1 2 |
sample_set = {'value1', 'value2','value3', 'value4', 'value2'} # {'value4', 'value1', 'value3', 'value2'} |
⚫︎ イミュータブルな型を要素として格納することができる:
set型は値だけでなく、イミュータブルな型を要素として格納することができます。
その為、タプルは格納できますが、リストや辞書は格納できません。
例
1 2 3 4 5 6 7 8 |
sample_set = {'value1', 'value2','value3', 'value4',('value1', 'value2','value3')} # {'value3', ('value1', 'value2', 'value3'), 'value2', 'value1', 'value4'} sample_set = {'value1', 'value2','value3', 'value4',['value1', 'value2','value3']} # TypeError: unhashable type: 'list' sample_set = {'value1', 'value2','value3', 'value4',{1:'value1',2: 'value2',3:'value3'}} # TypeError: unhashable type: 'dict' |
⚫︎ 多次元で要素を格納することはできない:
set型は、2次元や3次元のような多次元のset型を作成することができません。
作成するとエラーになります。
例
1 2 |
sample_set = {{'value1', 'value2'},{'value3', 'value2'}} # TypeError: unhashable type: 'set' |
set型(集合型)の基本的な使い方
set型(集合型)の基本的な使い方について紹介していきます。
set型に要素を追加する
set型に要素を追加するにはadd()を使用します。
しかし、set型はインデックスが付与されていませんので、追加はされますが、ランダムに並べられます。
例
1 2 3 4 5 6 7 8 9 10 |
sample_set = {'value1', 'value2','value3', 'value4'} print(sample_set) sample_set.add('value10') print('・add()で値を追加') print(sample_set) print('・add()で値を追加') sample_set.add('value12') print(sample_set) |
出力結果
{‘value1’, ‘value2’, ‘value3’, ‘value4’}
・add()で値を追加
{‘value1’, ‘value2’, ‘value4’, ‘value10’, ‘value3’}
・add()で値を追加
{‘value1’, ‘value12’, ‘value2’, ‘value4’, ‘value10’, ‘value3’}
「value10」と「value12」が追加されますが、print()関数で表示するとランダムに並べられています。
set型の要素を削除する
set型の要素を削除するにはdiscard()やremove()を使用します。
例
1 2 3 4 5 6 7 8 9 10 |
sample_set = {'value1', 'value2','value3', 'value4'} print(sample_set) sample_set.discard('value2') print('・discard()で値を削除') print(sample_set) print('・remove()で値を削除') sample_set.remove('value1') print(sample_set) |
出力結果
{‘value2’, ‘value1’, ‘value4’, ‘value3’}
・discard()で値を削除
{‘value1’, ‘value4’, ‘value3’}
・remove()で値を削除
{‘value4’, ‘value3’}
discard()やremove()によって「value1」と「value2」が削除されています。
set型の要素を全て削除する
set型の要素を全て削除するにはclear()を使用します。
例
1 2 3 4 5 |
sample_set = {'value1', 'value2','value3', 'value4'} print(sample_set) print('・clear()で値を削除') print(sample_set) |
出力結果
{‘value1’, ‘value2’, ‘value4’, ‘value3’}
・clear()で値を削除
{‘value3’, ‘value2’, ‘value4’}
set()
clear()によってset型の要素が全て削除されます。
set型(集合型)の応用的な使い方
set型(集合型)の応用的な使い方について紹介していきます。
set型から別のオブジェクトに変更する
set型は別のオブジェクトに変更することができます。
set型からリストに変更するにはlist()を、set型からタプルに変更するにはtuple()を使用します。
例
1 2 3 4 5 6 7 8 9 10 11 12 |
sample_set = {'value1', 'value2','value3', 'value4'} print(sample_set) print(type(sample_set)) print('・list()でset型をリストに変更') sample_list = list(sample_set) print(sample_list) print(type(sample_list)) print('・tuple()でset型をタプルに変更') sample_tuple = tuple(sample_set) print(sample_tuple) print(type(sample_tuple)) |
出力結果
{‘value1’, ‘value2’, ‘value3’, ‘value4}
<class ‘set’>
・set()でリストをset型に変更
[‘value2’, ‘value1’, ‘value3’, ‘value4’]
<class ‘list’>
・set()でタプルをset型に変更
(‘value2’, ‘value1’, ‘value3’, ‘value4’)
<class ‘tuple’>
list()によってset型がリストに、tupleによってset型がタプルに変更されています。
set型の長さ(要素数)を調べる
set型の長さ(要素数)を調べるにはlen()を使用します。
例
1 2 3 4 |
sample_set = {'value1', 'value2','value3', 'value4'} print(sample_set) print('・len()でset型の長さを調べる') print('sample_setの長さ', len(sample_set)) |
出力結果
{‘value1’, ‘value3’, ‘value2’, ‘value4’}
・len()でset型の長さを調べる
sample_setの長さ 4
len()によってset型の長さ(要素数)を調べています。
set型をコピーする
set型をコピーするにはcopy()を使用します。
例
1 2 3 4 5 |
sample_set = {'value1', 'value2','value3', 'value4'} print(sample_set) print('・copy()でset型をコピー') sample_set2 = sample_set.copy() print(sample_set2) |
出力結果
{‘value2’, ‘value3’, ‘value4’, ‘value1’}
・copy()でset型をコピー
{‘value2’, ‘value3’, ‘value4’, ‘value1’}
copy()によってset型がコピーされています。
set型の要素を検索する
set型の要素を検索するにはin演算子を使用します。
例
1 2 3 4 5 |
sample_set = {'value1', 'value2','value3', 'value4'} print(sample_set) print('・in演算子でset型の要素を検索') print('value1' in sample_set) print('value13' in sample_set) |
出力結果
{‘value4’, ‘value2’, ‘value3’, ‘value1’}
・in演算子でset型の要素を検索
True
False
in演算子によって「value1」は含まれるのでTrueを、「value13」は含まれないのでFalseを返しています。
set型の要素をまとめて取り出す
set型の要素をまとめて取り出すにはfor文を使用します。
例
1 2 3 4 5 |
sample_set = {'value1', 'value2','value3', 'value4'} print(sample_set) print('・forでset型の要素を取り出す') for i in sample_set: print(i) |
出力結果
{‘value4’, ‘value3’, ‘value1’, ‘value2’}
・forでset型の要素を取り出す
value4
value3
value1
value2
for文によってset型の要素をまとめて取り出しています。
set型(集合型)で集合演算を行う
set型はset型同士で和集合や差集合などの様々な集合演算を行うことができますので、set型の集合演算について紹介していきます。
和集合の計算を行う
和集合の計算を行うには|演算子やunion()を使用します。
例
1 2 3 4 5 6 7 8 9 10 |
sample_set1 = {1, 2, 3, 4, 5, 10} sample_set2 ={6, 7, 8, 11, 12} print(sample_set1) print(sample_set2) print('・|演算子で和集合の計算を行う') sample_set_sum1 = sample_set1 | sample_set2 print(sample_set_sum1) print('・union()で和集合の計算を行う') sample_set_sum2 = sample_set1.union(sample_set2) print(sample_set_sum2) |
出力結果
{1, 2, 3, 4, 5, 10}
{6, 7, 8, 11, 12}
・|演算子で和集合の計算を行う
{1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12}
・union()で和集合の計算を行う
{1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12}
|演算子やunion()によってset型の和集合の計算を行っています。
差集合の計算を行う
差集合の計算を行うには-演算子やdifference()を使用します。
例
1 2 3 4 5 6 7 8 9 10 |
sample_set1 = {1, 2, 3, 4, 5, 10} sample_set2 ={6, 7, 8, 11, 10} print(sample_set1) print(sample_set2) print('・-演算子で和集合の計算を行う') sample_set_sum1 = sample_set1 - sample_set2 print(sample_set_sum1) print('・difference()で和集合の計算を行う') sample_set_sum2 = sample_set1.difference(sample_set2) print(sample_set_sum2) |
出力結果
{1, 2, 3, 4, 5, 10}
{6, 7, 8, 10, 11}
・-演算子で和集合の計算を行う
{1, 2, 3, 4, 5}
・difference()で和集合の計算を行う
{1, 2, 3, 4, 5}
-演算子やdifference()によってset型の差集合の計算を行っています。
積集合の計算を行う
積集合の計算を行うには&演算子やintersection()を使用します。
例
1 2 3 4 5 6 7 8 9 10 |
sample_set1 = {1, 2, 3, 4, 5, 10} sample_set2 ={6, 2, 8, 11, 10} print(sample_set1) print(sample_set2) print('・&演算子で積集合の計算を行う') sample_set_sum1 = sample_set1 & sample_set2 print(sample_set_sum1) print('・intersection()で積集合の計算を行う') sample_set_sum2 = sample_set1.intersection(sample_set2) print(sample_set_sum2) |
出力結果
{1, 2, 3, 4, 5, 10}
{2, 6, 8, 10, 11}
・&演算子で積集合の計算を行う
{2, 10}
・intersection()で積集合の計算を行う
{2, 10}
&演算子やintersection()によってset型の積集合の計算を行っています。
上位集合の計算を行う
上位集合の計算を行うには>=演算子やissuperset()を使用します。
上位集合とはset型の要素ががもう片方のset型の要素を全て含んでいるのかを判断し、含んでいるならTrue、含んでいないならFalseを返します。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sample_set1 = {1, 2, 3, 4, 5, 10} sample_set2 ={6, 2, 8, 11, 10} print(sample_set1) print(sample_set2) print('・>=演算子で上位集合の計算を行う') sample_set_sum1 = sample_set1 >= sample_set2 print(sample_set_sum1) sample_set4 = {1, 2, 3, 4, 5, 10} sample_set3 ={2, 10} print('・issuperset()で上位集合の計算を行う') sample_set_sum2 = sample_set4.issuperset(sample_set3) print(sample_set_sum2) |
出力結果
{1, 2, 3, 4, 5, 10}
{2, 6, 8, 10, 11}
・>=演算子で上位集合の計算を行う
False
・issuperset()で上位集合の計算を行う
True
>=演算子やissuperset()によってset型の上位集合の計算を行っています。
部分集合の計算を行う
部分集合の計算を行うには<=演算子やissubset()を使用します。
部分集合とは上位集合の逆で、set型の要素ががもう片方のset型の要素に全て含まれているのかを判断し、含まれているならTrue、含まれていないならFalseを返します。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sample_set1 = {1, 2} sample_set2 = {1, 2, 8, 11, 10} print(sample_set1) print(sample_set2) print('・<=演算子で上位集合の計算を行う') sample_set_sum1 = sample_set1 <= sample_set2 print(sample_set_sum1) sample_set3 = {2, 9} sample_set4 = {1, 2, 3, 4, 5, 10} print('・issubset()で部分集合の計算を行う') sample_set_sum2 = sample_set3.issubset(sample_set4) print(sample_set_sum2) |
出力結果
{1, 2}
{1, 2, 8, 10, 11}
・<=演算子で上位集合の計算を行う
True
・issubset()で部分集合の計算を行う
False
<=演算子やissubset()によってset型の部分集合の計算を行っています。
補集合の計算を行う
補集合の計算を行うにはisdisjoint()を使用します。
補集合とは要素に属さない要素全体のことであり、お互いの要素の共通する要素が存在しない場合はTrue、お互いの要素の共通する要素が存在する場合はFalseを返します。
例
1 2 3 4 5 6 7 8 9 10 11 12 |
sample_set1 = {7, 9} sample_set2 = {8, 11} sample_set3 = {1, 2, 8, 11, 10} print(sample_set1) print(sample_set2) print(sample_set3) print('・isdisjoint()で補集合の計算を行う') sample_set_sum1 = sample_set1.isdisjoint(sample_set3) print(sample_set_sum1) sample_set_sum2 = sample_set2.isdisjoint(sample_set3) print(sample_set_sum2) |
出力結果
{9, 7}
{8, 11}
{1, 2, 8, 10, 11}
・isdisjoint()で補集合の計算を行う
True
False
issubset()によってset型の補集合の計算を行っています。
set型(集合型)でイミュータブルな型を作成する方法
set型でイミュータブルな型を作成するにはfrozenset()を使用します。
frozenset()とはfrozenset型に変更する関数であり、frozenset型によってタプルのような要素の追加、削除など操作ができないイミュータブルな型に変更することができます。
もし、frozenset型について詳しく知りたい場合はこちらをご参考ください。
例
1 2 3 4 5 6 7 8 |
sample_set = {'value1', 'value2','value3', 'value4'} print(sample_set) print(type(sample_set)) print('・set型をfrozenset型に変更') sample_frozenset = frozenset(sample_set) print(sample_frozenset) print(type(sample_frozenset)) |
出力結果
{‘value2’, ‘value4’, ‘value3’, ‘value1’}
<class ‘set’>
・set型をfrozenset型に変更
frozenset({‘value2’, ‘value4’, ‘value3’, ‘value1’})
<class ‘frozenset’>
frozenset()によってset型でイミュータブルな型であるfrozenset型を作成しています。
今回のポイント
set型とは集合を扱うための型である
⚫︎ set型とは集合を扱うための型であり、複数の値を格納できる
⚫︎ set型の注意点として要素にインデックスが付与されない、どの値も一つの要素として格納する、イミュータブルな型を要素として格納することができる、多次元で要素を格納することはできないという点がある
⚫︎ set型に要素を追加するにはadd()を使用する
⚫︎ set型の要素を削除するにはdiscard()やremove()を使用する
⚫︎ set型の要素を全て削除するにはclear()を使用する
⚫︎ set型からリストに変更するにはlist()を、set型からタプルに変更するにはtuple()を使用する
⚫︎ set型の長さ(要素数)を調べるにはlen()を使用する
⚫︎ set型の要素を検索するにはin演算子を使用する
⚫︎ set型をコピーするにはcopy()を使用する
⚫︎ set型の要素をまとめて取り出すにはfor文を使用する
⚫︎ set型はset型同士で様々な集合演算を行うことができる
⚫︎ set型でイミュータブルな型を作成するにはfrozenset()を使用する
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。