Python環境を起動中... 初回のみ数秒かかります
Lesson 7 / 20

タプルと集合

このレッスンで学ぶこと

  • タプルが「変更不可(イミュータブル)」であることと、その使いどころを理解できる
  • set で重複を排除し、ユニークな値のコレクションを扱える
  • 和集合・積集合・差集合などの集合演算ができる
  • リスト・タプル・集合をいつ使い分けるか判断できる

1. タプル(tuple)— 変更できないリスト

タプルは丸括弧 () で作るコレクションで、一度作ると要素を変更できません(イミュータブル)。 「変更されてはいけない値の組み合わせ」に使います。

典型的な用途:座標値 (x, y)、RGB色 (255, 128, 0)、 テンソルの形状 (batch_size, channels, height, width)、関数からの複数戻り値。

sample_1.py
Ctrl+Enter
出力

⚠ コードの中の try: / except について:
これは例外処理といい、エラーが発生したときにプログラムを止めずに対応する仕組みです。詳しくはレッスン17「例外処理」で学びます。
ここでの意味:タプルの要素を書き換えようとすると TypeError(型エラー)が発生します。 try: ブロックでそのコードを実行し、except TypeError as e: でエラーを受け取ってメッセージを表示しています。 今は「変更しようとするとエラーになることを確認するための記法」として理解しておきましょう。

💡 タプルとPyTorch: PyTorchでは tensor.shape がタプルを返します。 batch, c, h, w = tensor.shape のようにアンパックするコードが至る所に登場します。 今のうちにアンパックに慣れておきましょう。

sample_2.py
Ctrl+Enter
出力

⚠ コードの中の def について:
def 関数名(引数):関数の定義です。処理をまとめて名前をつけ、何度でも呼び出せるようにする仕組みで、詳しくはレッスン10で学びます。
ここでは「平均・最小・最大の3つの値を1つにまとめて返す処理」として使っています。 タプルは関数から複数の値をまとめて返すときに自然に使われる型です。

2. set — 重複を持たない集合

set重複を自動的に排除 する順序なしのコレクションです。 「ユニークな値だけを保持したい」場面や、「2つのグループの共通点・差異を調べたい」場面で威力を発揮します。

データ前処理でのラベルの種類確認、患者IDの重複チェックなどに使われます。

💡 set の作り方は2通りあります:

  • set(リスト) — リストを変換して作る(コード前半で使用)
  • {"値1", "値2", "値3"} — 波括弧 {} で直接作る(コード後半で使用)

波括弧 {}レッスン8で学ぶ辞書(dict)でも使います。 区別のポイントは「コロン : があるかどうか」です。
{"A", "B"}(コロンなし)→ set{"key": "value"}(コロンあり)→ dict
なお {}(中身が空)は set ではなく dict として扱われるため、空の set を作るときは set() と書きます。

sample_3.py
Ctrl+Enter
出力

💡 set の in は高速:
リストの in は先頭から1件ずつ全部調べるため、データが多いほど時間がかかります。
一方、set は内部に「検索用の索引」を持っているため、データ件数が増えてもほぼ一定の速さで検索できます。
「含まれているか調べる」処理が多い場合は、リストを set() に変換するだけで大幅に高速化できます。

3. 集合演算

set は数学の集合論と同じ演算を演算子1つで書けます。 「2つのグループに共通するものは何か」「どちらか一方にしかないものは何か」 といった問いに、ループを書かずに一発で答えられます。

医療データでは患者グループの重複確認・照合・差分抽出で活用できます。 機械学習では「訓練データとテストデータにクラスの漏れがないか」の確認にも使われます。

演算記号メソッド意味
和集合A | BA.union(B)AまたはBに含まれる要素
積集合A & BA.intersection(B)AとB両方に含まれる要素
差集合A - BA.difference(B)AにありBにない要素
対称差A ^ BA.symmetric_difference(B)どちらか一方にだけある要素

💡 その他のよく使う集合メソッド:

  • A.issubset(B):A のすべての要素が B に含まれるとき True(「A は B の部分集合」)。A <= B と同じ意味
  • A.isdisjoint(B):A と B に共通する要素が1つもないとき True。共通要素があれば False
small = {"P001", "P003"}
large = {"P001", "P002", "P003"}
print(small.issubset(large))   # → True(small の全要素が large に含まれる)

x = {"P001"}
y = {"P002", "P003"}
print(x.isdisjoint(y))         # → True(共通要素なし)

下のコードでも使用しています。

sample_4.py
Ctrl+Enter
出力

4. リスト・タプル・set の使い分け

リスト・タプル・set はいずれも「複数の値を扱う」ためのデータ構造ですが、 変更できるか・順序があるか・重複を持つかの3点で性質が異なります。 適切な型を選ぶことで、コードの意図が明確になり、バグも防ぎやすくなります。

判断の基本は次の通りです。順番に意味があるデータは list、 作ったあと変わらない組み合わせは tuple、 重複なし・存在確認が多い場合は set を選びます。

順序変更重複主な用途
listあり可能あり順序が重要なデータ列、追加・削除が必要な場合
tupleあり不可あり座標・形状など変わらない組み合わせ、関数の複数戻り値
setなし可能なしユニークな値の管理、集合演算、高速な存在確認
sample_5.py
Ctrl+Enter
出力

5. 練習問題

問題 1

検査結果をタプルで管理する

患者「田中」の検査結果を (名前, WBC, RBC, Hb) のタプルで作り、 アンパックして各値を表示してください。

exercise_1.py
出力
ヒントを見る(答え+解説)
# タプルを作成してアンパック
# WBC=6200, RBC=420, Hb=13.5

result = ("田中", 6200, 420, 13.5)

name, wbc, rbc, hb = result  # アンパック

print(f"{name}の検査結果:")
print(f"  WBC: {wbc} /μL")
print(f"  RBC: {rbc} 万/μL")
print(f"  Hb:  {hb} g/dL")

タプルは () で作り、変数1, 変数2, ... = タプル でアンパックできます。アンパックの変数の数はタプルの要素数と一致させる必要があります。

問題 2

2グループの共通患者IDを求める

外来グループと入院グループの患者IDから、両方に存在する患者ID(積集合)を求めてください。

exercise_2.py
出力
ヒントを見る(答え+解説)
outpatient = {"P001", "P003", "P005", "P008", "P010"}
inpatient  = {"P003", "P005", "P007", "P009", "P010"}

both = outpatient & inpatient
# または
# both = outpatient.intersection(inpatient)

print("両グループに存在する患者:", sorted(both))
# → ['P003', 'P005', 'P010']

&(積集合)は両方の集合に含まれる要素だけを返します。.intersection() メソッドでも同じ結果が得られます。患者の重複チェックやデータ照合でよく使います。

問題 3

重複ラベルを排除してクラス数を調べる

データセットのラベルリストから set を使って重複を排除し、 ユニークなクラス数と各クラスのラベル値を出力してください。

exercise_3.py
出力
ヒントを見る(答え+解説)
labels = [2, 0, 1, 0, 3, 2, 1, 0, 4, 3, 2, 1, 0, 4, 2]

# set で重複排除
unique = set(labels)

# クラス数とラベル一覧を出力
print(f"クラス数: {len(unique)}")
print(f"ラベル一覧: {sorted(unique)}")
# → クラス数: 5 / ラベル一覧: [0, 1, 2, 3, 4]

set() は重複を自動で取り除くため、リストに何種類の値があるかを一瞬で調べられます。機械学習でクラス数を確認するときの定番パターンです。

まとめ

このレッスンのポイント

  • タプル () はイミュータブル(変更不可)。座標・形状・複数戻り値に使う
  • a, b, c = tuple のアンパックでスッキリ代入できる(PyTorchで多用)
  • set は重複を自動排除し、in による検索が高速(要素数に関わらず一定の速さ。リストは要素数が増えるほど遅くなる)
  • 集合演算: |(和)&(積)-(差)^(対称差)
  • set(list) で重複排除、sorted(set) で並べて戻せる

自由に試してみましょう:

free_practice.py
Ctrl+Enter
出力

完了するとトップページに進捗が表示されます