Pythonのset型|基本の使い方から応用まで実例付きで解説

Python

(最終更新月:2022年11月)

✔当記事はこのような方に向けて書かれています

「Pythonのsetで何ができるのだろうか?」

「Python setの使い方が知りたい」

「setで使える属性やメソッドについて詳しく知りたい」

✔当記事を通じてお伝えすること

  • Python setの基本構成
  • Python setと辞書の違い・注意点
  • setで使える属性一覧

当記事では、Pythonのsetについての基本事項だけでなく、さまざまなコードや実例までご理解いただけます

ぜひ最後までご覧ください。

icon
icon

筆者プロフィール

筆者プロフィールアイコン

【現職】プロマネ/システムプランニング

【副業】ブログ(月間7万PV)/YouTube/Web・アプリ制作

【元】外資系金融機関の営業

コミュニケーション × ビジネススキル × 文章力 × プログラミングスキルを活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

Pythonのsetについて知っておくべき基本事項3選

当記事では、Pythonのsetについて、基本事項をお伝えします。

具体的な使い方を知る前に、まずは基本的なことをすべて網羅しておきましょう

  • Pythonのsetとは?
  • setの作り方
  • setと辞書の違い|作る際の注意点

Pythonのsetとは?

Pythonのsetは、データ型のひとつで、集合を扱うものです。

set型の特徴は以下のとおり。

  • それぞれがユニークな要素である(重複しない)
  • set間の和や差、積を求められる
  • 要素はすべて順不同

以下、setの例です。

>>> sports
{'basketball', 'baseball', 'soccer'}
>>> type(sports)
<class 'set'>

setとfrozensetについて

set型に近しいものとして、frozensetがあります。

frozensetは、set型のタプルといえる、データが固定されたものです。

またset型とfrozenset型で以下のようなことも。

  • frozenset()で、set型をfrozenset型へ
  • set()で、frozenset型をset型へ

先程のset型「sports」を使った例は、以下のとおり。

>>> frozen_sports = frozenset(sports)
>>> frozen_sports
frozenset({'basketball', 'baseball', 'soccer'})
>>> type(frozen_sports)
<class 'frozenset'>
>>> type(set(frozen_sports))
<class 'set'>

setと辞書の違い|作る際の注意点

setは、{}で囲われた型なので、辞書と似ています。

しかし、キーが無いため特定の値を取り出せないのが特徴です。

辞書と混合しないために気を付けるべき点は、空のsetを作るとき。

空のset型を作る時は、以下のとおりです。

empty_set = set()

#以下は辞書になる
empty_dict = {}

Python setを作る方法3選

Pythonのsetを作る方法を複数ご説明します。

どんな集合体を作りたいのかで、適切なやり方は異なるのです。

  • set関数を使う
  • { }を使う
  • 内包表記を使う

set関数を使う

set関数を使えば、set型が作れます。

  • 空のset型を作る
  • ほかのデータ型から返還する

空のset型を作る

空のデータ型は、set関数で簡単に作れます。

>>> empty_set = set()

ほかのデータ型から返還する

set関数を使えば、ほかのデータ型からの変換が可能。

リスト型をset型へ

>>> fruits_list
['banana', 'apple', 'pineapple']
>>> set(fruits_list)
{'banana', 'pineapple', 'apple'}

タプル型をset型へ

>>> fruits_tuple
('banana', 'apple', 'pineapple')
>>> set(fruits_tuple)
{'banana', 'pineapple', 'apple'}

辞書型をset型へ

>>> fruits_dictionary
{1: 'banana', 2: 'apple', 3: 'pineapple'}
>>> set(fruits_dictionary)
{1, 2, 3}

#値をset型にする
>>> set(fruits_dictionary.values())
{'banana', 'pineapple', 'apple'}

文字列型をset型へ

>>> fruit_string
'banana'
>>> set(fruit_string)
{'a', 'n', 'b'}

1文字ずつとなり、重複したものは削除されます。

{ }を使う

{}を使い、setも作れます。

>>> menu = {"pasta", "pizza", "tacos"}
>>> type(menu)
<class 'set'>

文字列に使うと、文字列がそのままset型になります。

>>> a_food = "pasta"
>>> a_food_set = {a_food}
>>> a_food_set
{'pasta'}
>>> type(a_food_set)
<class 'set'>

set関数を使うと、一文字にずつに分割されますが、{} を使うとまとまって、set内に格納されます。

内包表記を使う

内包表記でも、setを作れます。

>>> nums = list(range(10))
>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> nums_set = {i*i for i in nums}
>>> nums_set
{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
>>> type(nums_set)
<class 'set'>

要素を追加するメソッド:add

set型に値を追加する時は、addを使います。

set型.add(要素)

>>> langs = {'PHP', 'Python', 'JavaScript', 'Java'}
>>> langs.add("Swift")
>>> langs
{'JavaScript', 'PHP', 'Python', 'Swift', 'Java'}

集合に集合を追加する方法3選

要素ひとつだけ追加するのではなく、集合を集合に追加する方法があります。

  • union
  • update
  • 演算子「 | 」

union

unionは、既存のset型を変更せず、2つのset型を結合した新しいものを作ります

set型①.union(set型②)

>>> langs = {'PHP', 'Python', 'JavaScript', 'Java'}
>>> frameworks = {'React', 'Laravel', 'Django'}
>>> langs.union(frameworks)
{'Java', 'Python', 'React', 'Django', 'JavaScript', 'PHP', 'Laravel'}
>>> langs
{'PHP', 'Python', 'JavaScript', 'Java'} #既存のものは変更されていない
>>> frameworks
{'React', 'Laravel', 'Django'} #既存のものは変更されていない

演算子「 | 」

「|」でも、新しいset型が生成されます。

set型①|set型②

>>> langs|frameworks
{'Java', 'Python', 'React', 'Django', 'JavaScript', 'PHP', 'Laravel'}

update

updateを使うと、set型①にset型②を加えた形になります。

set型①.update(set型②)

>>> langs = {'PHP', 'Python', 'JavaScript', 'Java'}
>>> frameworks = {'React', 'Laravel', 'Django'}
>>> langs.update(frameworks)
>>> langs
{'Java', 'Python', 'React', 'Django', 'JavaScript', 'PHP', 'Laravel'}

要素を削除するメソッド4選

要素を削除する方法をお伝えします。

  • remove
  • pop
  • discard
  • clear

remove

removeは単に、指定した要素を取り除くメソッドです。

値が存在しない場合はエラーになります。

set型.remove(要素)

>>> langs = {'PHP', 'Python', 'JavaScript', 'Java'}
>>> langs.remove('Java')
>>> langs
{'PHP', 'Python', 'JavaScript'}

#値が存在しないとエラーになる
>>> langs.remove("Go")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Go'

pop

popメソッドを使うと、ランダムにひとつだけ要素を取り出せます。

set型.pop(要素)

>>> langs = {'PHP', 'Python', 'JavaScript', 'Java'}
>>> popped_lang = langs.pop()
>>> popped_lang
'PHP'
>>> langs
{'Python', 'JavaScript', 'Java'}

discard

単に要素を削除するもの。

ただし、値が存在しないと何もおこらない

set型.discard(要素)

>>> langs = {'PHP', 'Python', 'JavaScript', 'Java'}
>>> langs.discard("JavaScript")
>>> langs
{'PHP', 'Python', 'Java'}
>>> langs.discard("Go")
>>> langs
{'PHP', 'Python', 'Java'}

clear

clearメソッドは、set型を空にします。

set型.clear(要素)

>>> langs = {'PHP', 'Python', 'JavaScript', 'Java'}
>>> langs.clear()
>>> langs
set()

要素の数を数える:len

len(set型)

>>> langs = {'PHP', 'Python', 'JavaScript', 'Java'}
>>> len(langs)
4

要素の共通部分を見つける(積集合):intersection

積集合とは、複数のset型で共通するものを見つけ出すこと。

以下の2通りの方法があります。

  • intersection
  • 演算子「&」

intersection

set型①.intersection(set型②)

>>> pitchers = {"大谷", "前田", "ダルビッシュ"}
>>> batters = {"大谷", "イチロー","松井"}
>>> pitchers.intersection(batters)
{'大谷'}

演算子「&」

set型①&set型②

>>> pitchers = {"大谷", "前田", "ダルビッシュ"}
>>> batters = {"大谷", "イチロー","松井"}
>>> pitchers&batters
{'大谷'}

集合間の違いを洗い出す(差集合・対象差集合)

集合間の違いを洗い出す方法です。

  • 差集合:difference・演算子「-」
  • 対象差集合:symmetric_difference・演算子「^」

差集合:difference・演算子「-」

差集合とは、ひとつの集合からもう一つの集合に含まれている要素を差し引いたもの。

どちらからどちらを引くかにより、答えが異なります。

difference

set型①.difference(set型②)

>>> pitchers = {"大谷", "前田", "ダルビッシュ"}
>>> batters = {"大谷", "イチロー","松井"}

#ピッチャー - バッター
>>> pitchers.difference(batters)
{'ダルビッシュ', '前田'}

#バッター - ピッチャー
>>> batters.difference(pitchers)
{'松井', 'イチロー'}

演算子「-」

set型① – set型②

>>> pitchers = {"大谷", "前田", "ダルビッシュ"}
>>> batters = {"大谷", "イチロー","松井"}

#ピッチャー - バッター
>>> pitchers - batters
{'ダルビッシュ', '前田'}


#バッター - ピッチャー
>>> batters - pitchers
{'松井', 'イチロー'}

対象差集合:symmetric_difference・演算子「^」

対象差集合とは、どちらかに含まれているものを取り出します。

intersectionや「&」で取り出せる要素以外のものです。

  • symmetric_difference
  • 演算子「^」

symmetric_difference

set型①.symmetric_difference(set型②)

>>> pitchers = {"大谷", "前田", "ダルビッシュ"}
>>> batters = {"大谷", "イチロー","松井"}

>>> pitchers.symmetric_difference(batters)
{'イチロー', 'ダルビッシュ', '松井', '前田'}

演算子「」^

set型①^set型②

>>> pitchers = {"大谷", "前田", "ダルビッシュ"}
>>> batters = {"大谷", "イチロー","松井"}

>>> pitchers^batters
{'イチロー', 'ダルビッシュ', '松井', '前田'}

部分集合・上位集合

集合の親子関係を調べる方法です。

返す値は、Boolean型(TrueもしくはFalse)になります。

  • 部分集合:issubset・演算子「<=」
  • 上位集合:issuperset・演算子「>=」

部分集合:issubset・演算子「<=」

set型①がset型②の部分集合であるかを、True/Falseで返します。

set型①.issubset(set型②)

set型①<=set型②

>>> pitchers = {"大谷", "前田", "ダルビッシュ"}
>>> batters = {"大谷", "イチロー","松井"}
>>> players = pitchers.union(batters) #playersは、pitchersとbattersの和集合

#issubset関数
>>> pitchers.issubset(batters)
False
>>> pitchers.issubset(players)
True

#演算子「<=」
>>> pitchers<=batters
False
>>> pitchers<=players
True

上位集合:issuperset・演算子「>=」

set型①がset型②の上位集合であるかを、True/Falseで返します。

set型①.issuperset(set型②)

set型①>=set型②

>>> pitchers = {"大谷", "前田", "ダルビッシュ"}
>>> batters = {"大谷", "イチロー","松井"}
>>> players = pitchers.union(batters) #playersは、pitchersとbattersの和集合

#issuperset関数
>>> pitchers.issuperset(players)
False
>>> players.issuperset(pitchers)
True

#演算子「>=」
>>> pitchers >= players
False
>>> players >= pitchers
True

集合体をコピーする:copy

集合体をコピーする方法は以下のとおり。

set型.copy()

>>> pitchers
{'ダルビッシュ', '大谷', '前田'}
>>> pitchers2 = pitchers.copy()
>>> pitchers2
{'ダルビッシュ', '大谷', '前田'}

同じ要素がないかをチェックする:isdisjoint

isdisjoint関数は、同じ要素がないかをチェックします。

同じ要素があれば、Falseとなります。

set型①.isdisjoint(set型②)

>>> pitchers = {"大谷", "前田", "ダルビッシュ"}
>>> batters = {"大谷", "イチロー","松井"}

#大谷がどちらにもいるので、Falseとなる
>>> pitchers.isdisjoint(batters)
False

#大谷を取り除くと、Trueとなる
>>> pitchers.remove("大谷")
>>> pitchers.isdisjoint(batters)
True

まとめ:Pythonのsetを活用すると、集合体でさまざまなことができる

当記事の内容をまとめます。

  • set型とは、重複しない要素が入った集合体のこと
  • setを作るのは、set関数、もしくは{}を使う
  • set型同士で、和集合や差集合、積集合が作れる

Pythonのset型はあまり目に触れる機会がないかもしれません。

ただし、一度覚えるとかなり便利なことにも気づけたはず。

ぜひここでsetをマスターして、あなたのコーディングに活かしてください。

✔当ブログは以下のような方に向けて書かれています

「Djangoでのアプリ開発を学びたい!」

「Djangoで開発したアプリをWebで公開するにはどうするの?」

✔当ブログ掲載の記事

  • Djangoで作る日報アプリ開発
  • WebアプリをWeb上に公開する方法
  • Webアプリ開発に必要なそのほかの情報
【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

ITCブログにご協力いただける方は、以下もご検討いただけると嬉しいです。

ITCへ投げ銭をする

タイトルとURLをコピーしました