単一のデータしか入らない「変数」に対し、複数のデータをまとめて効率的に扱うための「データ構造」があります。特に重要な「リスト」「辞書」「タプル」という3つの入れ物の個性を理解し、複雑なデータを自在に操るスキルを身につけましょう。
データを順番に並べて格納します。後から要素の追加、変更、削除が可能(mutable)。時系列データや項目リストなど、順序が重要なデータに最適です。[ ]で作成します。
「キー」と「値」のペアでデータを格納。順番ではなく、意味のあるラベル(キー)でデータにアクセスします。患者情報や検査結果など、各項目に名前があるデータに便利です。{ }で作成します。
リストと似ていますが、一度作成すると中身を変更できません(immutable)。意図しない変更を防ぎ、データの安全性を保証したい場合に有効です。( )で作成します。
はじめに:複数のデータを整理する「大きな箱」
皆さん、こんにちは。前回の講義では、変数という「ラベル付きの箱」に、年齢や体温といった単一のデータを入れて扱う方法を学びましたね。これで、コンピュータに情報を記憶させる第一歩を踏み出すことができました。
しかし、実際の医療データはもっと複雑です。例えば、一人の患者さんが時系列で記録された複数の血圧データを持っていたり、一回の採血で数十項目もの検査結果が出たりします。これらをblood_pressure_1, blood_pressure_2, … のように一つ一つの変数で管理するのは、非常に手間がかかり、現実的ではありません。
そこで登場するのが、複数のデータをまとめて効率的に管理するための、「もっと大きなデータの入れ物」です。Pythonでは、これをデータ構造 (Data Structures) と呼びます。
この講義では、AI開発、特にデータ分析の現場で欠かせない、最も重要な3つのデータ構造を学びます。
- リスト (
list): 最も万能でよく使う「整理棚」 - 辞書 (
dict): 意味のあるラベルを付けて整理する「カルテファイル」 - タプル (
tuple): 変更しない・させない「封印されたデータ」
これらの「入れ物」のそれぞれの個性と使い方をマスターすることで、皆さんは複雑な医療データを自在に操るための、強力な武器を手に入れることができます。
1. リスト (list) – 最も万能で便利な「整理棚」
まずは、Pythonで最もよく使われ、最も基本的なデータ構造であるリストから見ていきましょう。
1.1 リストとは?
リストは、様々な種類のデータを「順番に」並べて格納できる、非常に便利な「整理棚」のようなものです。この「順番」がリストの重要な特徴です。
- 医療における例:
- ある患者さんの1週間の血圧測定値:
[135, 138, 132, 141, 139, 140, 137] - ある遺伝子の塩基配列の一部:
['A', 'T', 'G', 'C', 'G', 'T'] - 処方薬のリスト:
["アスピリン", "メトホルミン", "アトルバスタチン"]
- ある患者さんの1週間の血圧測定値:
1.2 リストの作り方と基本操作
リストは、角括弧 [] を使って作成し、各データ(要素)をカンマ , で区切ります。
Pythonコード例:リストの作成と基本操作
# --- 1. リストの作成 ---
# ある患者さんの1週間の収縮期血圧データをリストとして作成します。
blood_pressures = [135, 138, 132, 141, 139, 140, 137]
print(f"血圧データのリスト: {blood_pressures}")
print(f"データ型: {type(blood_pressures)}")
# --- 2. 要素へのアクセス(インデックス指定) ---
# プログラミングでは、順番は「0」から数えるのが基本です。これを「0ベースインデックス」と言います。
# 最初の要素(1日目)にアクセスするには、[0]と指定します。
first_day_bp = blood_pressures[0]
print(f"\n1日目の血圧: {first_day_bp}")
# 3番目の要素(3日目)にアクセスするには、[2]と指定します。
third_day_bp = blood_pressures[2]
print(f"3日目の血圧: {third_day_bp}")
# 負のインデックスも使えます。[-1]は「一番後ろの要素」を意味し、とても便利です。
last_day_bp = blood_pressures[-1]
print(f"最終日の血圧: {last_day_bp}")
# --- 3. 要素の変更 ---
# リストは「変更可能(mutable)」です。特定の場所の値を後から書き換えることができます。
# 例えば、2日目のデータが間違っていて、136に訂正する必要があったとします。
print(f"\n修正前のリスト: {blood_pressures}")
blood_pressures[1] = 136 # 2番目の要素(インデックスは1)を136に上書きします。
print(f"修正後のリスト: {blood_pressures}")
# --- 4. 要素の追加 ---
# .append() を使うと、リストの末尾に新しい要素を追加できます。
# 新しく8日目のデータを追加します。
blood_pressures.append(134)
print(f"\n8日目のデータを追加後: {blood_pressures}")
# --- 5. リストの長さを調べる ---
# len()関数を使うと、リストにいくつの要素が入っているかを知ることができます。
num_of_days = len(blood_pressures)
print(f"\n記録されている日数: {num_of_days} 日間")
# === ここから下が上記のprint文による実際の出力 ===
# 血圧データのリスト: [135, 138, 132, 141, 139, 140, 137]
# データ型: <class 'list'>
#
# 1日目の血圧: 135
# 3日目の血圧: 132
# 最終日の血圧: 137
#
# 修正前のリスト: [135, 138, 132, 141, 139, 140, 137]
# 修正後のリスト: [135, 136, 132, 141, 139, 140, 137]
#
# 8日目のデータを追加後: [135, 136, 132, 141, 139, 140, 137, 134]
#
# 記録されている日数: 8 日間
2. 辞書 (dict) – 意味のある「ラベル付き引き出し」
次に紹介するのは辞書 (dictionary) です。リストが順番でデータを管理する「整理棚」なら、辞書は「カルテの項目名」のような、意味のあるラベル(キー)を付けてデータを管理する「引き出し」のようなものです。
2.1 辞書とは?
辞書は、キー (key) と 値 (value) のペアでデータを格納します。順番ではなく、一意の「キー」を使って目的のデータに直接アクセスするのが特徴です。
- 医療における例:
- 一人の患者さんの情報:
{"name": "田中 太郎", "age": 65, "department": "循環器内科"} - 検査結果:
{"コレステロール": 220, "中性脂肪": 150, "HDL": 55}
- 一人の患者さんの情報:
2.2 辞書の作り方と基本操作
辞書は、波括弧 {} を使い、キー: 値 のペアをカンマ , で区切って作成します。
Pythonコード例:辞書の作成と基本操作
# --- 1. 辞書の作成 ---
# 一人の患者さんの情報を、辞書として作成します。
# キーは通常、意味のわかる文字列を使います。
patient_profile = {
"patient_id": "P00101",
"name": "田中 太郎",
"age": 65,
"has_allergy": False
}
print(f"患者プロファイル(辞書): {patient_profile}")
print(f"データ型: {type(patient_profile)}")
# --- 2. 値へのアクセス(キー指定) ---
# 辞書では、インデックス番号ではなく「キー」を使って値を取り出します。
patient_name = patient_profile["name"]
print(f"\n患者名: {patient_name}")
patient_age = patient_profile["age"]
print(f"年齢: {patient_age}")
# --- 3. 要素の追加と変更 ---
# 新しいキーと値のペアを追加したり、既存のキーの値を更新したりできます。
# 辞書もリストと同様に「変更可能(mutable)」です。
# 新しい項目「診療科」を追加します。
patient_profile["department"] = "循環器内科"
print(f"\n診療科を追加後: {patient_profile}")
# 年齢を更新します(誕生日が来た、という想定)
patient_profile["age"] = 66
print(f"年齢を更新後: {patient_profile}")
# === ここから下が上記のprint文による実際の出力 ===
# 患者プロファイル(辞書): {'patient_id': 'P00101', 'name': '田中 太郎', 'age': 65, 'has_allergy': False}
# データ型: <class 'dict'>
#
# 患者名: 田中 太郎
# 年齢: 65
#
# 診療科を追加後: {'patient_id': 'P00101', 'name': '田中 太郎', 'age': 65, 'has_allergy': False, 'department': '循環器内科'}
# 年齢を更新後: {'patient_id': 'P00101', 'name': '田中 太郎', 'age': 66, 'has_allergy': False, 'department': '循環器内科'}
3. タプル (tuple) – 変更しない・させない「封印されたデータ」
最後に紹介するタプルは、一見するとリストによく似ていますが、一つだけ決定的で非常に重要な違いがあります。
3.1 タプルとは?
タプルは、リストと同様に順序付きのデータの集まりですが、一度作成したら、その中身を絶対に変更できない(不変、immutable)という性質を持ちます。まるで、一度署名したら変更できない「同意書」や、改ざんが許されない「封印された治験データ」のようなものです。
- 医療における例:
- 座標データ:
(緯度, 経度) - 変更されるべきでない患者の基本情報:
("P00101", "1958-05-20")(IDと生年月日) - 関数の戻り値として複数の値を返すときにもよく使われます。
- 座標データ:
3.2 タプルの作り方と「不変性」の確認
タプルは、丸括弧 () を使って作成します。
Pythonコード例:タプルの作成と「不変性」の確認
# --- 1. タプルの作成 ---
# 変更してはいけない、患者IDと生年月日をタプルとして作成します。
patient_master_data = ("P00101", "1958-05-20")
print(f"患者マスターデータ(タプル): {patient_master_data}")
print(f"データ型: {type(patient_master_data)}")
# --- 2. 要素へのアクセス ---
# リストと同様に、インデックス番号でアクセスできます。
patient_id = patient_master_data[0]
print(f"\n患者ID: {patient_id}")
# --- 3. 要素を変更しようとすると...? ---
# タプルの要素を変更しようとすると、エラーが発生します!
# これが「不変性」です。データの安全性が保証されます。
print("\n--- タプルの要素を変更しようとするとエラーが発生します ---")
try:
# 0番目の要素を書き換えようと試みます。
patient_master_data[0] = "P00102"
except TypeError as e:
# エラーを捕捉してメッセージを表示します。
print(f"エラーが発生しました: {e}")
# === ここから下が上記のprint文による実際の出力 ===
# 患者マスターデータ(タプル): ('P00101', '1958-05-20')
# データ型: <class 'tuple'>
#
# 患者ID: P00101
#
# --- タプルの要素を変更しようとするとエラーが発生します ---
# エラーが発生しました: 'tuple' object does not support item assignment
このように、プログラムの途中で誤って重要なデータが書き換えられてしまうのを防ぎたい場合に、タプルは非常に有効です。
4. まとめ:3つのデータ構造の使い分け
ここまで見てきた3つのデータ構造の使い分けを、表にまとめてみましょう。
| 特徴 | リスト (list)「整理棚」 | 辞書 (dict)「カルテファイル」 | タプル (tuple)「封印された書類」 |
|---|---|---|---|
| 主な用途 | 順番が重要なデータの集まり | 意味のあるラベル付けをしたい情報の集まり | 変更したくないデータの集まり |
| 変更できるか? | 可能 (Mutable) | 可能 (Mutable) | 不可能 (Immutable) |
| 書き方 | [ ] | { } | ( ) |
この使い分けを意識できるようになると、Pythonでのデータ整理が格段に楽になり、より堅牢で読みやすいコードが書けるようになります。
5. 次のステップへ
今回は、複数のデータをまとめて効率的に扱うための基本的なデータ構造、リスト、辞書、タプルについて学びました。これらの「データの入れ物」を使いこなすことで、私たちは初めて、現実の複雑な医療データをプログラムで効率的に扱えるようになります。
さて、データの入れ物は準備できました。しかし、これらのデータを使って、条件によって処理を変えたり、たくさんのデータに同じ処理を自動で繰り返したりするにはどうすれば良いのでしょうか?
次回、「1.4:Pythonで学ぶプログラミング思考 ― if文とループで処理を自動化」では、プログラムに「知性」を与える、if文やforループといった制御構文について学んでいきます。
参考文献
- Python Software Foundation. Python 3.9.7 documentation. [Internet]. 2021 [cited 2025 Jun 6]. Available from: https://docs.python.org/3/tutorial/datastructures.html
- Beazley D, Jones B. Python Cookbook. 3rd ed. Sebastopol, CA: O’Reilly Media; 2013. Chapter 1, Data Structures and Algorithms.
ご利用規約(免責事項)
当サイト(以下「本サイト」といいます)をご利用になる前に、本ご利用規約(以下「本規約」といいます)をよくお読みください。本サイトを利用された時点で、利用者は本規約の全ての条項に同意したものとみなします。
第1条(目的と情報の性質)
- 本サイトは、医療分野におけるAI技術に関する一般的な情報提供および技術的な学習機会の提供を唯一の目的とします。
- 本サイトで提供されるすべてのコンテンツ(文章、図表、コード、データセットの紹介等を含みますが、これらに限定されません)は、一般的な学習参考用であり、いかなる場合も医学的な助言、診断、治療、またはこれらに準ずる行為(以下「医行為等」といいます)を提供するものではありません。
- 本サイトのコンテンツは、特定の製品、技術、または治療法の有効性、安全性を保証、推奨、または広告・販売促進するものではありません。紹介する技術には研究開発段階のものが含まれており、その臨床応用には、さらなる研究と国内外の規制当局による正式な承認が別途必要です。
- 本サイトは、情報提供を目的としたものであり、特定の治療法を推奨するものではありません。健康に関するご懸念やご相談は、必ず専門の医療機関にご相談ください。
第2条(法令等の遵守)
利用者は、本サイトの利用にあたり、医師法、医薬品、医療機器等の品質、有効性及び安全性の確保等に関する法律(薬機法)、個人情報の保護に関する法律、医療法、医療広告ガイドライン、その他関連する国内外の全ての法令、条例、規則、および各省庁・学会等が定める最新のガイドライン等を、自らの責任において遵守するものとします。これらの適用判断についても、利用者が自ら関係各所に確認するものとし、本サイトは一切の責任を負いません。
第3条(医療行為における責任)
- 本サイトで紹介するAI技術・手法は、あくまで研究段階の技術的解説であり、実際の臨床現場での診断・治療を代替、補助、または推奨するものでは一切ありません。
- 医行為等に関する最終的な判断、決定、およびそれに伴う一切の責任は、必ず法律上その資格を認められた医療専門家(医師、歯科医師等)が負うものとします。AIによる出力を、資格を有する専門家による独立した検証および判断を経ずに利用することを固く禁じます。
- 本サイトの情報に基づくいかなる行為によって利用者または第三者に損害が生じた場合も、本サイト運営者は一切の責任を負いません。実際の臨床判断に際しては、必ず担当の医療専門家にご相談ください。本サイトの利用によって、利用者と本サイト運営者の間に、医師と患者の関係、またはその他いかなる専門的な関係も成立するものではありません。
第4条(情報の正確性・完全性・有用性)
- 本サイトは、掲載する情報(数値、事例、ソースコード、ライブラリのバージョン等)の正確性、完全性、網羅性、有用性、特定目的への適合性、その他一切の事項について、何ら保証するものではありません。
- 掲載情報は執筆時点のものであり、予告なく変更または削除されることがあります。また、技術の進展、ライブラリの更新等により、情報は古くなる可能性があります。利用者は、必ず自身で公式ドキュメント等の最新情報を確認し、自らの責任で情報を利用するものとします。
第5条(AI生成コンテンツに関する注意事項)
本サイトのコンテンツには、AIによる提案を基に作成された部分が含まれる場合がありますが、公開にあたっては人間による監修・編集を経ています。利用者が生成AI等を用いる際は、ハルシネーション(事実に基づかない情報の生成)やバイアスのリスクが内在することを十分に理解し、その出力を鵜呑みにすることなく、必ず専門家による検証を行うものとします。
第6条(知的財産権)
- 本サイトを構成するすべてのコンテンツに関する著作権、商標権、その他一切の知的財産権は、本サイト運営者または正当な権利を有する第三者に帰属します。
- 本サイトのコンテンツを引用、転載、複製、改変、その他の二次利用を行う場合は、著作権法その他関連法規を遵守し、必ず出典を明記するとともに、権利者の許諾を得るなど、適切な手続きを自らの責任で行うものとします。
第7条(プライバシー・倫理)
本サイトで紹介または言及されるデータセット等を利用する場合、利用者は当該データセットに付随するライセンス条件および研究倫理指針を厳格に遵守し、個人情報の匿名化や同意取得の確認など、適用される法規制に基づき必要とされるすべての措置を、自らの責任において講じるものとします。
第8条(利用環境)
本サイトで紹介するソースコードやライブラリは、執筆時点で特定のバージョンおよび実行環境(OS、ハードウェア、依存パッケージ等)を前提としています。利用者の環境における動作を保証するものではなく、互換性の問題等に起因するいかなる不利益・損害についても、本サイト運営者は責任を負いません。
第9条(免責事項)
- 本サイト運営者は、利用者が本サイトを利用したこと、または利用できなかったことによって生じる一切の損害(直接損害、間接損害、付随的損害、特別損害、懲罰的損害、逸失利益、データの消失、プログラムの毀損等を含みますが、これらに限定されません)について、その原因の如何を問わず、一切の法的責任を負わないものとします。
- 本サイトの利用は、学習および研究目的に限定されるものとし、それ以外の目的での利用はご遠慮ください。
- 本サイトの利用に関連して、利用者と第三者との間で紛争が生じた場合、利用者は自らの費用と責任においてこれを解決するものとし、本サイト運営者に一切の迷惑または損害を与えないものとします。
- 本サイト運営者は、いつでも予告なく本サイトの運営を中断、中止、または内容を変更できるものとし、これによって利用者に生じたいかなる損害についても責任を負いません。
第10条(規約の変更)
本サイト運営者は、必要と判断した場合、利用者の承諾を得ることなく、いつでも本規約を変更することができます。変更後の規約は、本サイト上に掲載された時点で効力を生じるものとし、利用者は変更後の規約に拘束されるものとします。
第11条(準拠法および合意管轄)
本規約の解釈にあたっては、日本法を準拠法とします。本サイトの利用および本規約に関連して生じる一切の紛争については、東京地方裁判所を第一審の専属的合意管轄裁判所とします。
For J³, may joy follow you.

