1. タプル(tuple)— 変更できないリスト
タプルは丸括弧 () で作るコレクションで、一度作ると要素を変更できません(イミュータブル)。
「変更されてはいけない値の組み合わせ」に使います。
典型的な用途:座標値 (x, y)、RGB色 (255, 128, 0)、
テンソルの形状 (batch_size, channels, height, width)、関数からの複数戻り値。
⚠ コードの中の try: / except について:
これは例外処理といい、エラーが発生したときにプログラムを止めずに対応する仕組みです。詳しくはレッスン17「例外処理」で学びます。
ここでの意味:タプルの要素を書き換えようとすると TypeError(型エラー)が発生します。
try: ブロックでそのコードを実行し、except TypeError as e: でエラーを受け取ってメッセージを表示しています。
今は「変更しようとするとエラーになることを確認するための記法」として理解しておきましょう。
💡 タプルとPyTorch:
PyTorchでは tensor.shape がタプルを返します。
batch, c, h, w = tensor.shape のようにアンパックするコードが至る所に登場します。
今のうちにアンパックに慣れておきましょう。
⚠ コードの中の 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() と書きます。
💡 set の in は高速:
リストの in は先頭から1件ずつ全部調べるため、データが多いほど時間がかかります。
一方、set は内部に「検索用の索引」を持っているため、データ件数が増えてもほぼ一定の速さで検索できます。
「含まれているか調べる」処理が多い場合は、リストを set() に変換するだけで大幅に高速化できます。
3. 集合演算
set は数学の集合論と同じ演算を演算子1つで書けます。 「2つのグループに共通するものは何か」「どちらか一方にしかないものは何か」 といった問いに、ループを書かずに一発で答えられます。
医療データでは患者グループの重複確認・照合・差分抽出で活用できます。 機械学習では「訓練データとテストデータにクラスの漏れがないか」の確認にも使われます。
| 演算 | 記号 | メソッド | 意味 |
|---|---|---|---|
| 和集合 | A | B | A.union(B) | AまたはBに含まれる要素 |
| 積集合 | A & B | A.intersection(B) | AとB両方に含まれる要素 |
| 差集合 | A - B | A.difference(B) | AにありBにない要素 |
| 対称差 | A ^ B | A.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(共通要素なし)
下のコードでも使用しています。
4. リスト・タプル・set の使い分け
リスト・タプル・set はいずれも「複数の値を扱う」ためのデータ構造ですが、 変更できるか・順序があるか・重複を持つかの3点で性質が異なります。 適切な型を選ぶことで、コードの意図が明確になり、バグも防ぎやすくなります。
判断の基本は次の通りです。順番に意味があるデータは list、
作ったあと変わらない組み合わせは tuple、
重複なし・存在確認が多い場合は set を選びます。
| 型 | 順序 | 変更 | 重複 | 主な用途 |
|---|---|---|---|---|
list | あり | 可能 | あり | 順序が重要なデータ列、追加・削除が必要な場合 |
tuple | あり | 不可 | あり | 座標・形状など変わらない組み合わせ、関数の複数戻り値 |
set | なし | 可能 | なし | ユニークな値の管理、集合演算、高速な存在確認 |
5. 練習問題
検査結果をタプルで管理する
患者「田中」の検査結果を (名前, WBC, RBC, Hb) のタプルで作り、
アンパックして各値を表示してください。
ヒントを見る(答え+解説)
# タプルを作成してアンパック
# 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グループの共通患者IDを求める
外来グループと入院グループの患者IDから、両方に存在する患者ID(積集合)を求めてください。
ヒントを見る(答え+解説)
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() メソッドでも同じ結果が得られます。患者の重複チェックやデータ照合でよく使います。
重複ラベルを排除してクラス数を調べる
データセットのラベルリストから set を使って重複を排除し、
ユニークなクラス数と各クラスのラベル値を出力してください。
ヒントを見る(答え+解説)
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)で並べて戻せる
自由に試してみましょう:
完了するとトップページに進捗が表示されます