Pythonにはリスト以外にも、いくつかのデータ構造が用意されています。
その中でも、setとtupleはよく使われる基本的な型です。
ただし、この2つはリストと似ている部分もありつつ、性質がかなり異なります。
この記事では、
- setとは何か
- tupleとは何か
- リストとの違い
- それぞれの使いどころ
を、順番に整理しながら見ていきます。
Pythonの導入についてはこちら。
Python入門:最初のプログラムを作って実行する方法 – Lean Data Office
Python環境構築のやり方|初心者向け完全ガイド – Lean Data Office
setとは
まずはsetから確認します。
setは、重複しない値を集めたデータ構造です。
波かっこ {} を使って定義します。
my_set = {'a','b','c'}
print(my_set)

見た目は少し辞書に似ていますが、キーと値のペアではなく、「値だけ」を持っています。
setは他のデータ構造から作ることもできます。
my_set = set(['a', 'b', 'c'])
print(my_set)

また、タプルからでも同じように作れます。
my_set = set(('a', 'b', 'c'))
print(my_set)

どちらも結果は同じになります。
setの特徴として、「同じ要素を持てない」という点があります。
これを利用すると、リストの重複を簡単に取り除けます。
my_list = ['a', 'b', 'c', 'c']
my_list = list(set(my_list))
print(my_list)

ただし、この方法には注意点があります。
setは順番を持たないデータです。
そのため、リストに戻したときに順序が変わる可能性があります。
print(list(set(['b', 'a', 'c'])))

上の例でもリストの順序が変わっています。
結果は環境によって異なりますが、元の順序は保証されません。
この特徴は非常に重要で、リストとは大きく異なるポイントです。
順序がないため、インデックスで要素を取り出すこともできません。
my_set = {'a', 'b', 'c'}
print(my_set[0])

これはエラーになります。
setは「何番目」という考え方を持たないためです。
要素の追加と削除
setにはリストとは異なる操作方法があります。
my_set.add('d')
print(my_set)

addは値を追加するメソッドです。
リストのappendとは違い、「末尾に追加する」という概念はありません。
削除についても、set特有の動きがあります。
my_set.discard('a')
print(my_set)

discardは値を削除しますが、存在しない場合でもエラーになりません。
setにもpopがあります。
print(my_set.pop())

ただし、リストと違って「最後の要素」ではなく、どれか1つが取り出されます。
どの要素が返るかは保証されません。
tupleとは?
次にtupleを見ていきます。
tupleは、リストとよく似ていますが「変更できない」という特徴があります。
my_tuple = ('a', 'b', 'c')
print(my_tuple)

tupleは順序を持つため、インデックスでアクセスできます。
print(my_tuple[0])

リストと同じように扱える部分も多くあります。
ただし、値の変更はできません。
my_tuple[0] = 'x'

これはエラーになります。
tupleは作成後に変更されないデータです。
一見すると不便に見えますが、いくつかの利点があります。
まず、変更されないためメモリ効率が良くなります。
また、「変更されないことが保証されるデータ」として安心して扱えます。
Pythonでは、関数から複数の値を返すことができます。
def func():
return 1, 2, 3
result = func()
print(result)
print(type(result))
このように、カンマ区切りで値を返すと、自動的にタプルになります。
タプルは必ずしも括弧が必要ではありません。
my_tuple = 1, 2, 3
print(my_tuple)

この書き方でもタプルとして扱われます。
タプルは複数の変数に分解することもできます。
a, b, c = 1, 2, 3
print(a)
print(b)
print(c)

この操作は「アンパック」と呼ばれ、Pythonではよく使われる書き方です。
setとtupleは、どちらもリストと似ているようで性質が異なります。
setは順序を持たず重複を許さないデータ構造で、tupleは順序を持つが変更できないデータ構造です。
最初は違いが分かりにくいかもしれませんが、それぞれの特徴を理解しておくことで、
適切な場面で使い分けできるようになります。
特に、重複の除去や関数の戻り値など、実際のコードでもよく登場します。
少しずつ試しながら使い方に慣れていくと、自然と使い分けができるようになっていきます。