こんにちは、ナナです。
次に紹介するコンテナ第3弾は「set(セット)」です。
『リスト』や『タプル』にはインデックス番号で要素にアクセスできました。つまり、データに順番が存在するということです。
この『set』には順番という概念がありません。データを集合体として管理するためのコンテナです。
本記事では次の疑問点を解消する内容となっています。
では、『set』オブジェクトの扱い方について学んでいきましょう。
set(セット)の定義方法と使い方
今日は新しいコンテナの『set』ですね。『リスト』や『タプル』とは定義方法はどんな風に違うのですか?
Pythonの定義では明確にデータ型を指定することがないため、書き方でオブジェクトの種類を変えていることにそろそろ気づいていますね。
『set』においても、定義するときの書き方が決まっているんですよ。
『set』のオブジェクトを定義する際にも『リスト』や『タプル』とは違った書き方が必要となります。
セットオブジェクトの定義方法
セットオブジェクトの定義方法は、次の書式で記述します。
セットオブジェクトの定義の書式
変数名 ={値1, 値2, 値3, ・・・}
定義例
num_set ={10, 20, 30}
animal_set ={”象”, “虎”, “ネコ”, “キリン”}
リストは[]、タプルは()を使って定義しますが、セットは{}を使います。
では、具体的にプログラムで示しましょう。次のように『set』を定義します。
# セットオブジェクトの定義
num_set = {10, 20, 30, 40, 50}
animal_set = {"象", "虎", "ネコ", "キリン"}
# セット内容の画面表示
print(num_set)
print(animal_set)
『set』を参照する変数をprint関数の引数で指定すると、要素全てを表示することができます。
{40, 10, 50, 20, 30}
{'虎', 'キリン', 'ネコ', '象'}
ここでよく見てほしいのが、定義したときの順番とprint関数で表示された内容の順番が違っていますね。
順番の概念が存在しないのが『set』オブジェクトの特徴です。つまり、順番は関係なく、データを集合として管理したいという用途に使います。
『set』はmutable(変更可能)なオブジェクト
『リスト』はmutable、『タプル』はimmutableなオブジェクトでしたよね。
『set』はどっちのオブジェクトなんでしょうか?
『set』はね、mutableなオブジェクトなんですよ。だから、要素を追加したりと後から変更することができます。
『set』は『リスト』と同じく「mutable」なオブジェクトです。そのため、生成後でも要素を追加・削除することが可能です。
addメソッドを使って『set』の要素を追加してみよう!
「addメソッド」は、セットオブジェクトに要素を追加するメソッドです。引数に追加したいオブジェクトを指定します。
セットのaddメソッドの書式
セット変数名.add(要素が参照するオブジェクト)
使用例
animal_set.add(”熊”)
プログラムでは次のように使います。
# セットオブジェクトの定義
animal_set = {"象", "虎", "ネコ", "キリン"}
print(animal_set)
# 要素の追加
animal_set.add("熊")
print(animal_set)
# 要素の追加
animal_set.add("サイ")
print(animal_set)
{'キリン', 'ネコ', '象', '虎'}
{'虎', '熊', 'ネコ', 'キリン', '象'}
{'虎', '熊', 'ネコ', 'サイ', 'キリン', '象'}
セットオブジェクトは順番の概念がないため、要素を追加するたびに表示する順番すら変化する可能性があります。
『set』の要素は順番が必要な情報の管理には向いていません。
removeメソッドを使って『set』の要素を削除してみよう!
追加ができれば削除もできます。削除するためには「removeメソッド」を使います。
「remove」メソッドでは、引数でオブジェクトを指定して一致する要素を削除します。
セットのremoveメソッドの書式
セット変数名.remove(削除したいオブジェクト)
使用例
animal_set.remove(”虎”)
『セット』オブジェクトにはインデックス番号という概念がないため、オブジェクトを指定した削除になります。
# セットオブジェクトの定義
animal_set = {"象", "虎", "ネコ", "キリン"}
print(animal_set)
# 要素の削除
animal_set.remove("虎")
print(animal_set)
# 要素の削除
animal_set.remove("ネコ")
print(animal_set)
{'虎', '象', 'キリン', 'ネコ'}
{'象', 'キリン', 'ネコ'}
{'象', 'キリン'}
clearメソッドを使って『セット』の要素を全削除してみよう!
「removeメソッド」は1つの要素だけを削除しますが、「clearメソッド」は全ての要素を削除します。
セットのclearメソッドの書式
セット変数名.clear()
使用例
animal_set.clear()
プログラムでは、次のように利用します。
# セットオブジェクトの定義
animal_set = {"象", "虎", "ネコ", "キリン"}
print(animal_set)
# セットの要素を全て削除
animal_set.clear()
print(animal_set)
{'キリン', 'ネコ', '象', '虎'}
set()
空のセットオブジェクトをprin関数で表示すると「set()」と表示されます。
メソッドの構成は『リスト』と似ていますね。『リスト』のようにインデックスを指定できるメソッドが、『セット』にはありません。
『set』オブジェクトの生成方法
『リスト』と『タプル』はお互いに相互変換することができましたよね。『セット』も相互変換して作り出すことができるんですか?
その通り、『セット』は『リスト』『タプル』から作り出すことができます。
『リスト』と『タプル』から『set』を作る
『リスト』や『タプル』から『セット』オブジェクトを作ることができます。
set関数の引数にリストオブジェクトやタプルオブジェクトを指定します。
# リストとタプルの定義
list1 = [10, 20, 30, 40, 50]
tuple1 = ("A", "B", "C")
# 「リスト」と「タプル」から「セット」を生成
set1 = set(list1)
set2 = set(tuple1)
print(set1)
print(set2)
{40, 10, 50, 20, 30}
{'C', 'B', 'A'}
このように「set関数」の引数にオブジェクトを指定することで、セットオブジェクトを作り出すことができます。
『set』から『リスト』や『タプル』を作る
逆に『set』から『リスト』や『タプル』を作り出すことも、もちろん可能です。
ただし、順番の概念のない『set』から作るということは要素の順番に規則性がないと言えます。
# セットの定義
set1 = {10, 20, 30, 40, 50}
# 「セット」から「リスト」と「タプル」を生成
list1 = list(set1)
tuple1 = tuple(set1)
print(list1)
print(tuple1)
[40, 10, 50, 20, 30]
(40, 10, 50, 20, 30)
順番のない『set』から『リスト』や『タプル』を作るときは、順番が保証されないため扱う際には注意しましょう!
frozenset関数を使ったimmutableな『フローズンセット』
『set』はmutable(変更可能)なオブジェクトですが、『frozenset(フローズンセット)』と呼ばれるimmutableなオブジェクトがあります。
次のように「frozenset関数」を使って、引数にオブジェクトを指定することで生成します。
# frozenset関数を使ったセットの生成
frozenset1 = frozenset({10, 20, 30, 40, 50})
print(frozenset1)
frozenset({50, 20, 40, 10, 30})
このように生成された『フローズンセット』オブジェクトは氷漬けとなり、immutableなオブジェクトになります。
引数には『リスト』や『タプル』オブジェクトを指定することも可能です。
「frozen」とは「氷結した」といった意味です。まさしく氷漬けにして変更できないようにしているオブジェクトってことですね。
frozensetオブジェクトはimmutableなため、「addメソッド」や「removeメソッド」は使うことができません。
Q&A:setの定義・追加・削除に関するよくある質問
『set』の追加・削除について質問ある人はどうぞ!
Q:「addメソッド」で同一のオブジェクトを追加した場合はどうなる?
『set』ってデータの集合を示すんですよね。もしも、すでに存在するオブジェクトを追加しようとしたらどうなるんですか?
『set』は集合としての役割を持つデータのため重複したデータを複数登録することはできないんですよ。
では実際に「addメソッド」で追加してみましょう!
# セットオブジェクトの定義
animal_set = {"象", "虎", "ネコ", "キリン"}
print(animal_set)
# すでに存在するオブジェクトを追加
animal_set.add("象")
print(animal_set)
{'虎', '象', 'キリン', 'ネコ'}
{'虎', '象', 'キリン', 'ネコ'}
同じオブジェクトの追加に関しては、何事もなく処理が終了します。『set』の性質上、同じ情報を複数登録されることはありません。
すでに存在するオブジェクトを追加しようとした場合は、追加が無視されます。
Q:「removeメソッド」で存在しないオブジェクト削除しようとした場合はどうなる?
では、次に「removeメソッド」で存在しないオブジェクトを削除しようとしたらどうなるんですか?
addメソッドと同じく、これも何も起きず動くってことですよね。
何事も実験ですよ!では、存在しないオブジェクトを指定して動かしてみましょう。
setオブジェクトから存在しないオブジェクトを削除しようとすると何がおこるのでしょうか?実験してみましょう。
# セットオブジェクトの定義
animal_set = {"象", "虎", "ネコ", "キリン"}
print(animal_set)
# 存在しない要素の削除
animal_set.remove("ひつじ")
print(animal_set)
File "C:/PythonProject/project1/main.py", line 6, in <module>
animal_set.remove("ひつじ")
KeyError: 'ひつじ'
この場合は例外が発生します。つまり、removeメソッドでは存在しないオブジェクトは消さないようにする必要があります。
例外が発生するのが嫌なケースにおいては、「discardメソッド」を使うことで回避することができます。
# セットオブジェクトの定義
animal_set = {"象", "虎", "ネコ", "キリン"}
print(animal_set)
# discardメソッドで削除
animal_set.discard("ひつじ")
print(animal_set)
{'ネコ', 'キリン', '虎', '象'}
{'ネコ', 'キリン', '虎', '象'}
「discardメソッド」の場合はこのように、対象のオブジェクトが『set』内の要素に存在しなくても、例外が発生することなく無視されます。
「discard」は「捨てる」という意味です。