Developer

【Python独学】セット(集合)の特徴と作成
2020.11.02
Lv1

【Python独学】セット(集合)の特徴と作成

今回は、セット(集合)について扱っていきます。
リストやタプルなどと似ているようで異なるものですので、気をつけてみていきましょう。


セット(集合)とは?

数学における「集合」は、何らかのものや値の集まりを表すものです。
数学では、「ベン図」を使ってある要素を持つグループを組み合わせて、AまたはB、AだがBではない、AかつB、といった組み合わせを表しました。
おそらく学校の授業などで扱った人も多いのではないでしょうか。以下のような図を見たことがあると思います。

Pythonでは、集合を「セット型」というデータ型で表します。
セット型は、リストと同じように複数の値をまとまった1つのデータとして扱うデータ型です。
もちろん、リストとはいくつか違いがあります。セット型の特徴は以下のとおりです。

・重複した値を持たない(同じ値は1つだけ)
・要素の順番を保持しない
・要素の追加、削除などが可能(タプルよりリストに近い)
・集合演算ができる
・要素の検索がリストやタプルよりも早い…ことがある

以下の図のように、リストは重複した値を持つことができますし、値には順番があります。
しかし、セットは重複した値を持つことができず、それぞれの値には順番もありません。
リストの場合は、インデックスを使ってある順番の値を取り出したりすることができました。
セットの場は、インデックスを指定して何番目の要素を取り出す、といったことはできません。

ではセットはどのような場合に使うかというと、ある要素の集まり同士を比較したり、
集合の中に特定の要素が含まれているか調べたり、リストなどから重複を削除するときに使われます。
そのために、和集合、積集合といった集合演算と呼ばれる演算が用意されています。集合演算については、後日の記事で見ていきましょう。


セットを作ってみよう

それではさっそく、セットの作り方をみてみましょう。
セットは、以下のようにカンマで区切った複数の要素を {} で囲って表現します。

set_test = {1, 2, 3}     ### {} で囲ったカンマ区切りの複数の値

print(set_test)
C:\Python> python 9-1_1.py
{1, 2, 3}

{} で作るものとして、Pythonでは辞書型というデータ型もありますが、表記の仕方が若干違いますので
気をつけてください。
辞書型については他の記事で紹介していますので、参考にしてみてください。

セット型では、1つのデータ型ではなく異なるデータ型を要素として含めることもできます。
ただし、値が変化しないタプルはOKですが、あとから値を更新することが出来るリストはセット型に登録できません。

セット型にリストを含めようとすると…

list_test = [10, 20, 30]
set_list = {1, "xyz", list_test}

print(set_list)
C:\Python> python 9-1_2.py
Traceback (most recent call last):
File “9-1_2.py”, line 2, in
set_list = {1, “xyz”, list_test}
TypeError: unhashable type: ‘list’
以上のようにエラーになります。

タプルの場合はOKです。

tuple1 = ("Django", "Flask", "Bottle")
set_tuple = {2, "パイソン", tuple1}

print(set_tuple)
C:\Python> python 9-1_3.py
{‘パイソン’, (‘Django’, ‘Flask’, ‘Bottle’), 2}

セット型では、要素を格納した時点でハッシュ化し、その値を使って要素を並べたり、検索したりしています。
そのため、ハッシュ化できない = 要素が固定ではない = ミュータブルなオブジェクトであるリストなどは
要素として格納することはできません。
{} を使ったセットの作成において、1要素として指定できないオブジェクトとしては、リスト集合などがあげられます。

さて、セットを作るもう1つの方法として、組み込み関数の set() を使う方法があります。

set([iterable])

引数として与えられるのはイテラブルなオブジェクト、つまりリストやタプル、文字列などです。
イテラブルなオブジェクトとは、for文で繰り返し処理を行うことができるオブジェクトです。

では実際にset()を使ってみましょう。

list1 = ["Django", "Flask", "Bottle", "Django"]   ### "Django"という値が重複している
string1 = "しんぶんし"                             ### 順序、重複のある文字列

set_test1 = set(list1)
set_test2 = set(string1)

print(set_test1)
print(set_test2)
C:\Python> python 9-1_4.py
{‘Bottle’, ‘Django’, ‘Flask’}            ### 重複した値は1つになっている
{‘ん’, ‘ぶ’, ‘し’}                  ### 順序が並び替わっている

このように、リストや文字列などのイテラブルなオブジェクトを与えると、それらをセット型の値として
変換してくれます。
また、出力結果を見ると
・重複した値は除外されている
・もともとのオブジェクトが持つ順序は保持されていない
ことが確認できるかと思います。

ちなみに、要素の順番はランダムというわけではありません。先程ちらっと挙げたように、
セット型では要素を格納する際に、要素をハッシュ化して整理しているため、各要素はそのハッシュ値に応じた順番で格納されています。
なので、リストやタプルのように値を入れたときの順番がそのまま保持されるわけではないんですね。
同じ値を入れたセットだとしても、必ず同じ順序で格納されるとは限りません。

また、set()に引数を与えない場合、要素のない集合、空集合を作成できます。

set_emp = set()

print(set_emp)
C:\Python> python 9-1_5.py
set()

空集合をprint()で出力すると、上記のように set() と表示されます。
また、{} を使用した方法では空集合を作ることはできません。
以下のように実行すると、セットではなく空の辞書型と判断されてしまいます。

set_emp = {}

print(set_emp)
print(type(set_emp))    ### 作成したオブジェクトの型を確認する
C:\Python> python 9-1_6.py
{}
<class ‘dict’>        ### 辞書型(dict)になっている

空集合にはセット型に用意されている add() メソッドを使用することであとから要素を
追加することができます。要素の追加/削除については次回確認しましょう。


まとめ

・セット型(集合)は、複数のデータをまとめて扱うデータ型
・重複した値を持たない、要素の順序を持たない、などの特徴がある
・{}で作る方法、set()を使って作る方法がある


確認問題

以下の要素を持つセット型を、2種類の方法で作成してみましょう。
また、print()で出力し、重複した値や値の順序について確認してみましょう。

“セット型”, 100, “Django”, “Flask”, “Bottle”, “Django”, 100

答えはこちらの記事の最後に!
【Python連載】セット(集合)に要素を追加・削除する

連載目次

独学で学ぶ Pythonプログラミング 連載目次