Pythonの「複数の値をまとめる入れ物」と聞くと、まず思い浮かぶのがリスト(list)ですよね。でも実は、Pythonにはほかにも集合(set)とタプル(tuple)という強力な仲間がいます✨
「リストで十分じゃない?」と感じるかもしれませんが、この2つを使い分けられるようになると、コードが驚くほど短く・速く・読みやすくなります。重複の自動排除、グループ同士の計算、変更されたくないデータの安全な管理──そんな悩みが一気に解決していきますよ🚀
3つのデータ構造の特徴を、ひと目でわかる表のように整理してみましょう。
[1, 2, 3]{1, 2, 3}(1, 2, 3)「重複を消したい」「2つのグループを比べたい」なら集合、「絶対に書き換えたくないデータを安全に持ち回したい」ならタプル──そんな目的別の使い分けが見えてきます💡
集合は波括弧{}で作ります。リストからset()で変換することも可能です。
x_set = {1, 2, 3}
my_list = [1, 1, 2, 3, 3]
y_set = set(my_list)
print(y_set)
# → {1, 2, 3} ※重複が自動で消える!
順序を持たないため、y_set[0]のようなインデックス指定はできません。でもfor文で繰り返し処理することは可能です🔁
x_set.add(4) # 追加
x_set.remove(2) # 削除
add()で要素を追加、remove()で削除します。すでに同じ値があるときにadd()しても、集合の中身は変わりません🛡️
集合の真骨頂は、2つのグループを数学的に比較できること。たとえば「商品Aを買った人のID一覧」と「商品Bを買った人のID一覧」を比べたいとき、こんなことが1行で可能です。
a_users = {101, 102, 103, 104}
b_users = {103, 104, 105, 106}
a_users & b_users # 積集合:AもBも買った人
# → {103, 104}
a_users - b_users # 差集合:Aだけ買った人
# → {101, 102}
a_users | b_users # 和集合:AまたはBを買った人
# → {101, 102, 103, 104, 105, 106}
&(アンド):両方に含まれる要素-(マイナス):片方にだけ含まれる要素|(パイプ):どちらかに含まれる全要素これをリストでやろうとすると、forループとif文で何行も書く必要があります。集合ならたった1記号で完了。データ分析やユーザー集計で大活躍する機能です📊
タプルは丸括弧()で作ります。リストからtuple()で変換することも可能です。
x_tuple = (1, 3, 5, 7, 9)
my_list = [3, 4, 5]
y_tuple = tuple(my_list)
順序があるので、x_tuple[2]のようにインデックスで取り出せます。スライス([1:3]のような部分取り出し)も可能です。
x_tuple.append(4) # ❌ エラー!
x_tuple[0] = 99 # ❌ エラー!
リストでできたappend・remove・要素への代入は、すべてタプルでは禁止されます⛔ ただし「結合して新しいタプルを作る」ことはOKです。
z_tuple = x_tuple + y_tuple # 新しいタプルが生まれる
実は変更できないこと自体が安全装置になります。チームで作るコードで「このデータは絶対に書き換えてほしくない」ときや、辞書のキーとして使いたいとき(リストはキーにできませんがタプルはOK)に、タプルは無くてはならない存在です🔐
「タプルってわざわざ自分で作ること少なくない?」と感じるかもしれませんが、実はPythonのあちこちで陰の主役として働いています。代表的な2つのシーンを見てみましょう。
forでループするときprice_list = {"りんご": 120, "バナナ": 300, "いちご": 450}
for item in price_list.items():
print(item)
# → ('りんご', 120)
# → ('バナナ', 300)
# → ('いちご', 450)
.items()で取り出される1つひとつが、(キー, 値) のタプルになっています。なので普段はこう書きますよね👇
for key, value in price_list.items():
print(key, value)
これは「タプルを2つの変数に同時に代入する(アンパック)」という、Pythonならではの便利機能。タプルの存在を知ると、この書き方の正体がスッキリ理解できます🎯
def calc(x):
return x * 2, x * 3 # ← 実はタプル!
r1, r2 = calc(3)
print(r1, r2)
# → 6 9
「カンマで区切った戻り値」は、自動的にタプルになっています。受け取る側もr1, r2と書けば、タプルが2つの変数にアンパックされて代入されます。関数で複数の値を返せるのは、タプルのおかげだったんですね🎁
試しに変数を1つだけにしてみると…
result = calc(3)
print(result)
# → (6, 9) ← タプルそのものが入っている!
仕組みが見えると、Pythonの設計の美しさにちょっと感動しますよね✨
3つのデータ構造を、目的別にざっくり選び分けるなら次のとおりです。
len()迷ったら「そのデータは後から変更する?重複してもいい?順序は大事?」の3問を自分に問いかけてみるのがおすすめです🧭
動画と合わせて手元に1冊あると、リスト・集合・タプルの違いと使いどころが体系的に身につきます📖
変数・リスト・集合・タプル・辞書といったデータ構造を、対話形式で図解多めに学べる入門書。「なぜ複数の入れ物があるの?」という素朴な疑問から腹落ちさせたい方にぴったり。
list・tuple・set・dictの4大データ構造を順序立てて網羅。違いと使い分けが頭の中で整理され、コードの設計力がぐっと上がります。
frozensetやnamedtuple、collectionsモジュールなど「データ構造の応用編」まで踏み込んで学べる一冊。日々のコードがグッとPythonらしくなります📈
集合演算の知識はSQLのJOINや、pandasのデータ結合と直結します。実データの加工・集計を学ぶことで、集合とタプルを使う「目的」が立体的に理解できます。
「タプルとデータクラスの使い分け」「集合を使った重複排除イディオム」など、現場で本当に効くノウハウが90項目に凝縮。中級から上級への確かな足がかりです。
もっとも簡単なのは「リスト → 集合 → リスト」と変換する方法です。list(set(my_list))と書けば、重複が消えたリストが手に入ります。ただし順序が保証されないので、順序を保ちたい場合はdict.fromkeys()を使うのがおすすめです🧹
frozensetは「変更できない集合」です。普通の集合はadd()やremove()で中身を変えられますが、frozensetはタプルのように作成後は変更不可。辞書のキーに使いたい場合や、絶対に書き換えてほしくない集合を扱う場合に活躍します🔐
要注意ポイントです。(1)と書くと「ただの数値1」になってしまい、タプルになりません。1要素のタプルを作りたいときは(1,)と末尾にカンマを付ける必要があります。これはPythonの有名な落とし穴なので覚えておきましょう⚠️
辞書のキーには「変更できないオブジェクト(イミュータブル)」だけが使えるルールがあるためです。リストは中身を後から変えられるためキーには不向き、一方タプルは作成後に変えられないので安心してキーにできます。座標(x, y)を辞書のキーに使う、といった応用が可能になります🗝️
用途によりますが、「ある値が含まれているか」のチェックは集合が圧倒的に高速です(リストはO(n)、集合はO(1))。一方、要素の作成・読み出しだけならタプルがリストよりわずかに速いとされています。大量データを扱うときは、データ構造の選択がパフォーマンスを大きく左右します⚡
集合(set)は重複を消す・グループを計算するのが得意。タプル(tuple)は変更されない安全なデータとして、関数の戻り値や辞書のキーで陰の主役を担っています。リストだけに頼っていた頃には書けなかった、エレガントで効率的なコードが書けるようになりますよ✨
まずは身近なデータで試してみるのが一番。「リストから重複を消す」「2つのリストの共通部分を取り出す」「関数で2つの値を返す」──このあたりから手を動かしてみてください🌱
気づいたとき、あなたのコードは「データ構造を意識して書ける、ワンランク上のPythonコード」に進化しているはずです🌟 今日からさっそく、集合とタプルをコードに取り入れていきましょう!