ステップ8:タプルと辞書

📦 ステップ8: タプルと辞書

新しいデータ構造を学ぼう

前回はリストを学びました。今回は、リストと似ているけれど違う特徴を持つ「タプル」と、キーで値を管理する「辞書」を学びます。

📖 このステップで学ぶこと

・タプルとは何か、リストとの違い

・タプルの作り方とアンパック(展開)

・辞書(dict)とは何か

・辞書の作り方と値の取得

・辞書への追加・変更・削除

・辞書のループ処理と実践例

📝 1. タプルとは何か?

まず、タプルとは何か、なぜ必要なのかを理解しましょう。

🔰 リストとタプルの違い

タプルは変更できないリストです。一度作ったら、中身を変えることができません。

📌 リストとタプルの比較

特徴 リスト タプル
記号 角カッコ [ ] 丸カッコ ( )
変更 できる(ミュータブル) できない(イミュータブル)
要素の追加・削除 できる できない
辞書のキー 使えない 使える
処理速度 少し遅い 少し速い

💡 なぜタプルが必要?

「変更できない」ことがメリットになる場面があります:

データの安全性:うっかり値を変えてしまうミスを防げる

定数として使う:曜日、月名、色コードなど変わらないデータ

辞書のキーとして使える:リストは使えないがタプルは使える

関数から複数の値を返す:戻り値として便利

📝 タプルの作り方

タプルは丸カッコ () で囲んで作ります。

コード:タプルの基本的な作り方

# 文字列のタプル
fruits = ("りんご", "バナナ", "オレンジ")
print(fruits)
print(type(fruits))

# 数値のタプル
numbers = (1, 2, 3, 4, 5)
print(numbers)

# 空のタプル
empty = ()
print(empty)

実行結果

('りんご', 'バナナ', 'オレンジ')
<class 'tuple'>
(1, 2, 3, 4, 5)
()

💡 コードの解説

fruits = ("りんご", "バナナ", "オレンジ")

 → 丸カッコ () で囲んでタプルを作成

type(fruits)

 → データ型を確認。タプルは <class 'tuple'> と表示される

⚠️ 要素が1つのタプルに注意!

要素が1つのタプルを作る時は、必ず末尾にカンマを付けます。

❌ よくある間違い

# これはタプルではない!ただの整数になる
not_tuple = (10)
print(type(not_tuple))  # <class 'int'>

# これがタプル!カンマが必要
real_tuple = (10,)
print(type(real_tuple))  # <class 'tuple'>

実行結果

<class 'int'>
<class 'tuple'>

⚠️ 覚えておこう

(10) → これは整数の10。カッコは計算の優先順位を表すだけ

(10,) → これがタプル。カンマがあることでタプルになる

📝 カッコを省略したタプル

実は、丸カッコを省略してもタプルを作れます。

コード:カッコなしでタプル作成

# カンマで区切るだけでタプルになる
coordinates = 10, 20, 30
print(coordinates)
print(type(coordinates))

実行結果

(10, 20, 30)
<class 'tuple'>

🔍 2. タプルの操作

タプルの要素にアクセスする方法は、リストとほぼ同じです。

📝 インデックスでアクセス

リストと同じように、インデックス(番号)で要素を取り出せます。

コード:タプルの要素にアクセス

colors = ("赤", "青", "緑", "黄", "紫")

# インデックス0(最初の要素)
print(colors[0])

# インデックス-1(最後の要素)
print(colors[-1])

# len()で要素数を取得
print(f"要素数: {len(colors)}")

実行結果

赤
紫
要素数: 5

📝 スライスで一部を取り出す

コード:タプルのスライス

colors = ("赤", "青", "緑", "黄", "紫")

# [1:4] - インデックス1から4の手前まで
print(colors[1:4])

# [:3] - 最初から3の手前まで
print(colors[:3])

# [2:] - インデックス2から最後まで
print(colors[2:])

実行結果

('青', '緑', '黄')
('赤', '青', '緑')
('緑', '黄', '紫')

※スライスの結果もタプルになります

⚠️ タプルは変更できない

タプルの最大の特徴は「変更できない」ことです。

❌ エラーになる操作

numbers = (1, 2, 3, 4, 5)

# 要素の変更 → エラー!
# numbers[0] = 10  # TypeError: 'tuple' object does not support item assignment

# 要素の追加 → エラー!
# numbers.append(6)  # AttributeError: 'tuple' object has no attribute 'append'

# 要素の削除 → エラー!
# del numbers[0]  # TypeError: 'tuple' object doesn't support item deletion

print("タプルは変更・追加・削除ができません")

📝 タプルの連結と繰り返し

タプルは変更できませんが、新しいタプルを作ることはできます。

コード:タプルの連結と繰り返し

# タプルの連結(+演算子)
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
combined = tuple1 + tuple2
print(f"連結: {combined}")

# タプルの繰り返し(*演算子)
repeated = (1, 2) * 3
print(f"繰り返し: {repeated}")

実行結果

連結: (1, 2, 3, 4, 5, 6)
繰り返し: (1, 2, 1, 2, 1, 2)

💡 ポイント

+*は元のタプルを変更せず、新しいタプルを作成します。

元のtuple1やtuple2は変わりません。

🎯 3. タプルのアンパック(展開)

タプルの要素を複数の変数に一度に代入することをアンパック(展開)と呼びます。

🔰 アンパックとは?

💡 アンパックのイメージ

タプルという「箱」から、中身を取り出して、それぞれ別の変数に入れる操作です。

まとめて入っているものを「展開」して、個別に取り出すイメージです。

📝 基本的なアンパック

コード:タプルのアンパック

# 座標のタプル
point = (100, 200)

# アンパックして2つの変数に代入
# point[0]がxに、point[1]がyに入る
x, y = point

print(f"x座標: {x}")
print(f"y座標: {y}")

実行結果

x座標: 100
y座標: 200

💡 コードの解説

x, y = point は以下と同じ意味:

x = point[0]

y = point[1]

アンパックを使うと、1行でまとめて代入できます。

📝 3つ以上の要素をアンパック

コード:複数要素のアンパック

# 3D座標
point_3d = (10, 20, 30)

# 3つの変数にアンパック
x, y, z = point_3d

print(f"x = {x}")
print(f"y = {y}")
print(f"z = {z}")

実行結果

x = 10
y = 20
z = 30

⚠️ 注意

変数の数とタプルの要素数は一致させる必要があります。

一致しないとエラーになります。

📝 一部の要素だけ使う(_で無視)

使わない要素は _(アンダースコア)で受け取る慣習があります。

コード:一部を無視してアンパック

# 3つの要素があるが、真ん中は使わない
data = (100, 999, 300)

# _ は「使わない」ことを示す慣習
first, _, last = data

print(f"最初: {first}")
print(f"最後: {last}")

実行結果

最初: 100
最後: 300

📝 関数から複数の値を返す(超便利!)

アンパックが最も活躍するのは、関数から複数の値を受け取る時です。

コード:関数から複数の値を返す

# 最小値と最大値を同時に返す関数
def get_min_max(numbers):
    minimum = min(numbers)
    maximum = max(numbers)
    return minimum, maximum  # タプルとして返す

# 点数のリスト
scores = [85, 92, 78, 95, 88]

# アンパックして受け取る
min_score, max_score = get_min_max(scores)

print(f"最低点: {min_score}点")
print(f"最高点: {max_score}点")

実行結果

最低点: 78点
最高点: 95点

💡 コードの解説

return minimum, maximum

 → 2つの値をカンマで区切って返すと、タプルとして返される

min_score, max_score = get_min_max(scores)

 → 返ってきたタプルを2つの変数にアンパック

📝 タプルの実用例:定数データ

変更されたくないデータをタプルで定義すると安全です。

コード:定数としてのタプル

# 曜日(変更されたくないデータ)
# 変数名を大文字にすると「定数」であることを示す慣習
WEEKDAYS = ("月", "火", "水", "木", "金", "土", "日")

print(f"1週間は{len(WEEKDAYS)}日です")
print(f"最初の曜日: {WEEKDAYS[0]}")
print(f"週末: {WEEKDAYS[5]}曜日と{WEEKDAYS[6]}曜日")

# RGB色の定義(赤、緑、青の値)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

print(f"\n赤色のRGB: {RED}")
print(f"緑色のRGB: {GREEN}")

実行結果

1週間は7日です
最初の曜日: 月
週末: 土曜日と日曜日

赤色のRGB: (255, 0, 0)
緑色のRGB: (0, 255, 0)

📌 タプルを使う場面まとめ

場面
座標データ (x, y) や (x, y, z)
関数の戻り値 return min, max
定数データ 曜日、月名、色コード
辞書のキー {(0, 0): “原点”}

🗂️ 4. 辞書(dict)とは何か?

ここからは、もう一つの重要なデータ構造「辞書」を学びます。

🔰 辞書のイメージ

辞書は、実際の辞書(国語辞典など)と同じ考え方です。

💡 辞書のイメージ

国語辞典では「見出し語」で「意味」を調べますよね。

Pythonの辞書も同じで、キー(見出し語)値(意味)を取り出します。

例:「りんご」→「apple」、「年齢」→「25」

📘 辞書の基本的な特徴

特徴 説明
記号 波カッコ { } で囲む
構造 キー: 値 のペアで保存
キーの特徴 重複できない(ユニーク)
値の特徴 重複OK、どんな型でもOK
順序 挿入順序を保持(Python 3.7以降)

📝 辞書の作り方

辞書は波カッコ {} で囲み、キー: 値 のペアで書きます。

コード:辞書の基本的な作り方

# 学生の情報を辞書で管理
student = {
    "名前": "太郎",
    "年齢": 18,
    "学年": 3
}

print(student)
print(type(student))

実行結果

{'名前': '太郎', '年齢': 18, '学年': 3}
<class 'dict'>

💡 コードの解説

"名前": "太郎" → キーが”名前”、値が”太郎”

"年齢": 18 → キーが”年齢”、値が18(整数)

・各ペアはカンマ , で区切る

・キーには主に文字列を使うが、数値やタプルも使える

📝 様々な辞書の例

コード:いろいろな辞書

# 空の辞書
empty_dict = {}
print(f"空の辞書: {empty_dict}")

# 商品の価格を管理
prices = {
    "りんご": 150,
    "バナナ": 100,
    "オレンジ": 200
}
print(f"価格表: {prices}")

# 英単語の翻訳
translations = {
    "apple": "りんご",
    "banana": "バナナ",
    "orange": "オレンジ"
}
print(f"翻訳: {translations}")

# 数値をキーにすることも可能
scores = {
    1: "A",
    2: "B",
    3: "C"
}
print(f"評価: {scores}")

実行結果

空の辞書: {}
価格表: {'りんご': 150, 'バナナ': 100, 'オレンジ': 200}
翻訳: {'apple': 'りんご', 'banana': 'バナナ', 'orange': 'オレンジ'}
評価: {1: 'A', 2: 'B', 3: 'C'}

📊 リストと辞書の違い

📌 データの取り出し方の違い

データ構造 アクセス方法
リスト インデックス(番号)で取得 fruits[0] → “りんご”
辞書 キー(名前)で取得 student[“名前”] → “太郎”

🔑 5. 辞書から値を取得する

辞書から値を取得する方法は2つあります。

📝 方法1:[ ] でキーを指定

コード:[ ]で値を取得

student = {
    "名前": "太郎",
    "年齢": 18,
    "学年": 3
}

# キーを指定して値を取得
name = student["名前"]
age = student["年齢"]

print(f"名前: {name}")
print(f"年齢: {age}歳")

実行結果

名前: 太郎
年齢: 18歳

⚠️ 注意:存在しないキーを指定するとエラー

student = {"名前": "太郎", "年齢": 18}

# 存在しないキーを指定するとエラー!
# print(student["身長"])  # KeyError: '身長'

📝 方法2:get()メソッド(推奨!)

get()メソッドを使うと、キーが存在しなくてもエラーになりません。

コード:get()で安全に取得

student = {"名前": "太郎", "年齢": 18}

# get()で取得 - キーが存在する場合
name = student.get("名前")
print(f"名前: {name}")

# get()で取得 - キーが存在しない場合
height = student.get("身長")
print(f"身長: {height}")  # Noneが返る

# デフォルト値を指定
height = student.get("身長", "不明")
print(f"身長: {height}")  # "不明"が返る

実行結果

名前: 太郎
身長: None
身長: 不明

💡 get()の書き方

辞書.get(キー) → キーがなければNoneを返す

辞書.get(キー, デフォルト値) → キーがなければデフォルト値を返す

エラーを避けたい場合はget()を使いましょう!

📌 [ ] と get() の比較

方法 キーが存在しない場合 使いどころ
dict[key] エラー(KeyError) キーが必ず存在する時
dict.get(key) Noneを返す キーがあるか不明な時(推奨)
dict.get(key, 初期値) 初期値を返す デフォルト値を使いたい時

📝 キーの存在を確認する(in演算子)

in演算子でキーが存在するか確認できます。

コード:キーの存在確認

stock = {
    "りんご": 50,
    "バナナ": 30
}

# キーが存在するか確認
print("りんご" in stock)  # True
print("オレンジ" in stock)  # False

# if文と組み合わせて使う
if "バナナ" in stock:
    print(f"バナナの在庫: {stock['バナナ']}個")
else:
    print("バナナは在庫にありません")

実行結果

True
False
バナナの在庫: 30個

📝 キー一覧、値一覧、ペア一覧を取得

辞書の全体像を把握するためのメソッドがあります。

コード:辞書の一覧を取得

scores = {
    "国語": 85,
    "数学": 92,
    "英語": 78
}

# keys() - 全てのキーを取得
print("キー一覧:")
print(scores.keys())
print(list(scores.keys()))

# values() - 全ての値を取得
print("\n値一覧:")
print(scores.values())
print(list(scores.values()))

# items() - キーと値のペアを取得
print("\nペア一覧:")
print(scores.items())
print(list(scores.items()))

実行結果

キー一覧:
dict_keys(['国語', '数学', '英語'])
['国語', '数学', '英語']

値一覧:
dict_values([85, 92, 78])
[85, 92, 78]

ペア一覧:
dict_items([('国語', 85), ('数学', 92), ('英語', 78)])
[('国語', 85), ('数学', 92), ('英語', 78)]

💡 コードの解説

keys() → 全てのキーを返す

values() → 全ての値を返す

items() → (キー, 値)のタプルを返す

list()で囲むとリストに変換できる

➕ 6. 辞書への追加と変更

辞書は変更可能(ミュータブル)なので、後から要素を追加・変更できます。

📝 要素の追加

新しいキーを指定して値を代入すると、要素が追加されます。

コード:辞書に要素を追加

student = {
    "名前": "太郎",
    "年齢": 18
}
print(f"最初: {student}")

# 新しいキーで値を追加
# 辞書[新しいキー] = 値 で追加される
student["学年"] = 3
print(f"追加後: {student}")

student["クラス"] = "A組"
print(f"追加後: {student}")

実行結果

最初: {'名前': '太郎', '年齢': 18}
追加後: {'名前': '太郎', '年齢': 18, '学年': 3}
追加後: {'名前': '太郎', '年齢': 18, '学年': 3, 'クラス': 'A組'}

📝 要素の変更

既存のキーに新しい値を代入すると、値が変更されます。

コード:辞書の値を変更

student = {
    "名前": "太郎",
    "年齢": 18,
    "学年": 3
}
print(f"最初: {student}")

# 既存のキーで値を変更
# 辞書[既存キー] = 新しい値 で変更される
student["年齢"] = 19
print(f"変更後: {student}")

student["学年"] = 4
print(f"変更後: {student}")

実行結果

最初: {'名前': '太郎', '年齢': 18, '学年': 3}
変更後: {'名前': '太郎', '年齢': 19, '学年': 3}
変更後: {'名前': '太郎', '年齢': 19, '学年': 4}

💡 追加と変更の違い

書き方は同じ 辞書[キー] = 値 ですが:

・キーが存在しない場合 → 新しく追加される

・キーが存在する場合 → 値が上書きされる

📝 update()で複数の要素を一度に追加・更新

update()メソッドを使うと、複数のキーと値を一度に追加・更新できます。

コード:update()で一括更新

student = {"名前": "太郎", "年齢": 18}
print(f"最初: {student}")

# update()で複数のキーと値を一度に追加・更新
student.update({
    "年齢": 19,      # 既存キー → 更新
    "学年": 3,       # 新しいキー → 追加
    "クラス": "A組"  # 新しいキー → 追加
})
print(f"更新後: {student}")

実行結果

最初: {'名前': '太郎', '年齢': 18}
更新後: {'名前': '太郎', '年齢': 19, '学年': 3, 'クラス': 'A組'}

🗑️ 7. 辞書からの要素の削除

辞書から要素を削除する方法を学びましょう。

📘 削除方法の比較

方法 機能 戻り値
del dict[key] 指定したキーを削除 なし
dict.pop(key) 指定したキーを削除 削除した値を返す
dict.clear() 全要素を削除 なし

📝 del文で削除

コード:del文で削除

student = {
    "名前": "太郎",
    "年齢": 18,
    "学年": 3,
    "クラス": "A組"
}
print(f"最初: {student}")

# del で特定のキーを削除
del student["クラス"]
print(f"削除後: {student}")

実行結果

最初: {'名前': '太郎', '年齢': 18, '学年': 3, 'クラス': 'A組'}
削除後: {'名前': '太郎', '年齢': 18, '学年': 3}

📝 pop()で削除(値も取得)

pop()は削除した値を返すので、その値を使いたい場合に便利です。

コード:pop()で削除

student = {
    "名前": "太郎",
    "年齢": 18,
    "学年": 3
}
print(f"最初: {student}")

# pop() で削除して値を取得
age = student.pop("年齢")
print(f"削除した値: {age}")
print(f"削除後: {student}")

# 存在しないキーにはデフォルト値を指定できる
result = student.pop("クラス", "未設定")
print(f"削除した値: {result}")

実行結果

最初: {'名前': '太郎', '年齢': 18, '学年': 3}
削除した値: 18
削除後: {'名前': '太郎', '学年': 3}
削除した値: 未設定

💡 pop()の書き方

辞書.pop(キー) → キーがなければエラー

辞書.pop(キー, デフォルト値) → キーがなければデフォルト値を返す(エラーにならない)

📝 clear()で全削除

コード:clear()で全削除

student = {"名前": "太郎", "年齢": 18}
print(f"最初: {student}")

# clear() で全ての要素を削除
student.clear()
print(f"削除後: {student}")

実行結果

最初: {'名前': '太郎', '年齢': 18}
削除後: {}

🔄 8. 辞書のループ処理

辞書の全要素を処理する方法を学びましょう。

📝 キーでループ

辞書を直接forループに渡すと、キーが順番に取り出されます。

コード:キーでループ

scores = {
    "国語": 85,
    "数学": 92,
    "英語": 78
}

# 辞書を直接ループすると、キーが取り出される
for subject in scores:
    print(subject)

# 明示的にkeys()を使っても同じ
print("---")
for subject in scores.keys():
    print(subject)

実行結果

国語
数学
英語
---
国語
数学
英語

📝 値でループ

values()を使うと、値だけを順番に取り出せます。

コード:値でループ

scores = {
    "国語": 85,
    "数学": 92,
    "英語": 78
}

# values()で値だけを取り出す
for score in scores.values():
    print(f"{score}点")

実行結果

85点
92点
78点

📝 キーと値のペアでループ(最もよく使う!)

items()を使うと、キーと値を同時に取り出せます。これが最もよく使われます。

コード:items()でペアを取り出す

scores = {
    "国語": 85,
    "数学": 92,
    "英語": 78
}

# items()でキーと値を同時に取り出す
# (subject, score)のタプルとして返ってくるので、アンパックして受け取る
for subject, score in scores.items():
    print(f"{subject}: {score}点")

実行結果

国語: 85点
数学: 92点
英語: 78点

💡 コードの解説

for subject, score in scores.items():

items()は(キー, 値)のタプルを返す

subject, scoreでアンパックして2つの変数に代入

・1回のループでキーと値の両方を使える

📝 ループの実用例:合計と平均を計算

コード:辞書から合計・平均を計算

scores = {
    "国語": 85,
    "数学": 92,
    "英語": 78
}

# 合計を計算(values()を使う)
total = sum(scores.values())
print(f"合計: {total}点")

# 平均を計算
average = total / len(scores)
print(f"平均: {average}点")

# 各科目の評価を表示
print("\n【成績表】")
for subject, score in scores.items():
    if score >= 90:
        grade = "A"
    elif score >= 80:
        grade = "B"
    else:
        grade = "C"
    print(f"{subject}: {score}点 (評価: {grade})")

実行結果

合計: 255点
平均: 85.0点

【成績表】
国語: 85点 (評価: B)
数学: 92点 (評価: A)
英語: 78点 (評価: C)

🎯 9. 辞書の実践例

実際のプログラムで辞書がどのように使われるか、いくつかの例を見てみましょう。

例1: ユーザー情報の管理

コード:ユーザープロフィール

# ユーザープロフィールを辞書で管理
user = {
    "id": 1001,
    "名前": "山田太郎",
    "年齢": 25,
    "メール": "yamada@example.com",
    "都市": "東京"
}

# 情報を表示
print("【ユーザー情報】")
print(f"ID: {user['id']}")
print(f"名前: {user['名前']}")
print(f"年齢: {user['年齢']}歳")
print(f"メール: {user.get('メール', '未設定')}")
print(f"都市: {user.get('都市', '未設定')}")

実行結果

【ユーザー情報】
ID: 1001
名前: 山田太郎
年齢: 25歳
メール: yamada@example.com
都市: 東京

例2: 単語の出現回数をカウント

辞書を使って、文章内の単語の出現回数を数えることができます。

コード:単語のカウント

# 文章
text = "apple banana apple orange banana apple"

# スペースで区切ってリストにする
words = text.split()
print(f"単語リスト: {words}")

# 単語の出現回数を数える
word_count = {}

for word in words:
    # もし単語がすでに辞書にあれば+1、なければ1を設定
    if word in word_count:
        word_count[word] += 1
    else:
        word_count[word] = 1

print(f"\n出現回数: {word_count}")

実行結果

単語リスト: ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']

出現回数: {'apple': 3, 'banana': 2, 'orange': 1}

💡 より簡潔な書き方

get()を使うと、if文を使わずに書けます:

word_count = {}
for word in words:
    # get()で現在の値を取得(なければ0)して+1
    word_count[word] = word_count.get(word, 0) + 1

例3: 商品在庫管理システム

コード:在庫管理

# 商品在庫
inventory = {
    "りんご": 50,
    "バナナ": 30,
    "オレンジ": 40
}

# 在庫一覧を表示
print("【在庫一覧】")
for item, quantity in inventory.items():
    print(f"  {item}: {quantity}個")

# 商品を販売(在庫を減らす)
sold_item = "りんご"
sold_quantity = 5

if sold_item in inventory:
    if inventory[sold_item] >= sold_quantity:
        inventory[sold_item] -= sold_quantity
        print(f"\n{sold_item}を{sold_quantity}個販売しました")
        print(f"残り在庫: {inventory[sold_item]}個")
    else:
        print(f"在庫が不足しています")
else:
    print(f"{sold_item}は在庫にありません")

# 新商品を追加
inventory["ぶどう"] = 20
print(f"\n新商品「ぶどう」を追加しました")

# 最終在庫
print("\n【最終在庫】")
for item, quantity in inventory.items():
    print(f"  {item}: {quantity}個")

実行結果

【在庫一覧】
  りんご: 50個
  バナナ: 30個
  オレンジ: 40個

りんごを5個販売しました
残り在庫: 45個

新商品「ぶどう」を追加しました

【最終在庫】
  りんご: 45個
  バナナ: 30個
  オレンジ: 40個
  ぶどう: 20個

例4: 辞書とタプルの組み合わせ

辞書の値としてタプルを使うこともできます。

コード:生徒情報の管理

# 学籍番号をキー、(名前, 年齢, 成績)のタプルを値にする
students = {
    1001: ("山田太郎", 18, 85),
    1002: ("佐藤花子", 17, 92),
    1003: ("鈴木一郎", 18, 78)
}

# 全生徒の情報を表示
print("【生徒一覧】")
for student_id, info in students.items():
    # タプルをアンパックして個別の変数に代入
    name, age, score = info
    print(f"学籍番号: {student_id}")
    print(f"  名前: {name}")
    print(f"  年齢: {age}歳")
    print(f"  成績: {score}点")
    print()

実行結果

【生徒一覧】
学籍番号: 1001
  名前: 山田太郎
  年齢: 18歳
  成績: 85点

学籍番号: 1002
  名前: 佐藤花子
  年齢: 17歳
  成績: 92点

学籍番号: 1003
  名前: 鈴木一郎
  年齢: 18歳
  成績: 78点

💡 コードの解説

・辞書のキー:学籍番号(整数)

・辞書の値:(名前, 年齢, 成績)のタプル

for student_id, info in students.items():でキーと値を取得

name, age, score = infoでタプルをアンパック

📝 練習問題(12問)

ここまで学んだことを実際に手を動かして確認しましょう。

問題1:タプルの作成(初級)

📋 問題

3つの好きな色を含むタプルを作成し、表示してください。

解答を見る

コード

# タプルは丸カッコ () で作る
colors = ("赤", "青", "緑")
print(colors)
print(type(colors))

実行結果

('赤', '青', '緑')
<class 'tuple'>

問題2:タプルのアンパック(初級)

📋 問題

タプル point = (100, 200) をアンパックして、x座標とy座標を別々の変数に代入してください。

解答を見る

コード

point = (100, 200)

# アンパック:タプルの要素を個別の変数に代入
x, y = point

print(f"x座標: {x}")
print(f"y座標: {y}")

実行結果

x座標: 100
y座標: 200

問題3:辞書の作成(初級)

📋 問題

自分のプロフィール(名前、年齢、趣味)を辞書で作成してください。

解答を見る

コード

# 辞書は波カッコ {} で作る
# キー: 値 の形式で書く
profile = {
    "名前": "太郎",
    "年齢": 25,
    "趣味": "読書"
}

print(profile)

実行結果

{'名前': '太郎', '年齢': 25, '趣味': '読書'}

問題4:辞書から値を取得(初級)

📋 問題

辞書 book = {"タイトル": "Python入門", "著者": "山田太郎", "価格": 2980} から、タイトルと価格を取得して表示してください。

解答を見る

コード

book = {
    "タイトル": "Python入門",
    "著者": "山田太郎",
    "価格": 2980
}

# キーを指定して値を取得
title = book["タイトル"]
price = book["価格"]

print(f"タイトル: {title}")
print(f"価格: {price}円")

実行結果

タイトル: Python入門
価格: 2980円

問題5:辞書への要素追加(初級)

📋 問題

空の辞書を作成し、3つのキーと値のペアを追加してください。

解答を見る

コード

# 空の辞書を作成
my_dict = {}
print(f"最初: {my_dict}")

# 辞書[キー] = 値 で追加
my_dict["名前"] = "太郎"
my_dict["年齢"] = 20
my_dict["都市"] = "東京"

print(f"追加後: {my_dict}")

実行結果

最初: {}
追加後: {'名前': '太郎', '年齢': 20, '都市': '東京'}

問題6:辞書のループ(中級)

📋 問題

辞書 fruits = {"りんご": 100, "バナナ": 80, "オレンジ": 120} の全ての要素を「〇〇: 〇〇円」の形式で表示してください。

解答を見る

コード

fruits = {
    "りんご": 100,
    "バナナ": 80,
    "オレンジ": 120
}

# items()でキーと値を同時に取り出す
for fruit, price in fruits.items():
    print(f"{fruit}: {price}円")

実行結果

りんご: 100円
バナナ: 80円
オレンジ: 120円

問題7:辞書の値の更新(中級)

📋 問題

辞書 student = {"名前": "太郎", "点数": 80} の点数を90に更新してください。

解答を見る

コード

student = {
    "名前": "太郎",
    "点数": 80
}
print(f"最初: {student}")

# 既存のキーに新しい値を代入すると更新される
student["点数"] = 90
print(f"更新後: {student}")

実行結果

最初: {'名前': '太郎', '点数': 80}
更新後: {'名前': '太郎', '点数': 90}

問題8:get()メソッドの使用(中級)

📋 問題

辞書 user = {"名前": "太郎", "年齢": 25} から、「名前」と「メール」(存在しない)をget()メソッドで取得してください。メールが存在しない場合は「未設定」と表示してください。

解答を見る

コード

user = {
    "名前": "太郎",
    "年齢": 25
}

# get()で取得(キーがあれば値を返す)
name = user.get("名前")

# get()でデフォルト値を指定(キーがなければデフォルト値を返す)
email = user.get("メール", "未設定")

print(f"名前: {name}")
print(f"メール: {email}")

実行結果

名前: 太郎
メール: 未設定

問題9:辞書のキー存在確認(中級)

📋 問題

辞書 stock = {"りんご": 50, "バナナ": 30} に「オレンジ」というキーが存在するか確認してください。

解答を見る

コード

stock = {
    "りんご": 50,
    "バナナ": 30
}

# in演算子でキーの存在を確認
if "オレンジ" in stock:
    print("オレンジは在庫にあります")
else:
    print("オレンジは在庫にありません")

# True/Falseを直接確認
print(f"りんごは在庫にある: {'りんご' in stock}")
print(f"オレンジは在庫にある: {'オレンジ' in stock}")

実行結果

オレンジは在庫にありません
りんごは在庫にある: True
オレンジは在庫にある: False

問題10:辞書の要素数(中級)

📋 問題

辞書 colors = {"赤": "red", "青": "blue", "緑": "green", "黄": "yellow"} の要素数を表示してください。

解答を見る

コード

colors = {
    "赤": "red",
    "青": "blue",
    "緑": "green",
    "黄": "yellow"
}

# len()で辞書の要素数(キーと値のペア数)を取得
count = len(colors)
print(f"要素数: {count}")

実行結果

要素数: 4

問題11:辞書で成績管理(上級)

📋 問題

3科目の成績を辞書で管理し、以下を計算してください:

・合計点

・平均点

・最高点の科目名

科目: 国語85点、数学92点、英語78点

解答を見る

コード

scores = {
    "国語": 85,
    "数学": 92,
    "英語": 78
}

# 合計点:values()で全ての値を取得してsum()で合計
total = sum(scores.values())
print(f"合計点: {total}点")

# 平均点:合計 ÷ 科目数
average = total / len(scores)
print(f"平均点: {average}点")

# 最高点の科目を探す
max_score = 0
max_subject = ""

for subject, score in scores.items():
    if score > max_score:
        max_score = score
        max_subject = subject

print(f"最高点: {max_subject} {max_score}点")

実行結果

合計点: 255点
平均点: 85.0点
最高点: 数学 92点

問題12:辞書とタプルの組み合わせ(上級)

📋 問題

複数の生徒の情報をタプルと辞書を使って管理してください。

各生徒は(名前、年齢、成績)のタプルで、辞書のキーを学籍番号(1001, 1002, 1003)としてください。

全生徒の情報を表示してください。

解答を見る

コード

# 辞書の値としてタプルを使う
students = {
    1001: ("山田太郎", 18, 85),
    1002: ("佐藤花子", 17, 92),
    1003: ("鈴木一郎", 18, 78)
}

# 全生徒の情報を表示
print("【生徒一覧】")
for student_id, info in students.items():
    # タプルをアンパック
    name, age, score = info
    print(f"学籍番号: {student_id}")
    print(f"  名前: {name}")
    print(f"  年齢: {age}歳")
    print(f"  成績: {score}点")
    print()

実行結果

【生徒一覧】
学籍番号: 1001
  名前: 山田太郎
  年齢: 18歳
  成績: 85点

学籍番号: 1002
  名前: 佐藤花子
  年齢: 17歳
  成績: 92点

学籍番号: 1003
  名前: 鈴木一郎
  年齢: 18歳
  成績: 78点

❓ よくある質問

Q1: タプルとリストはどう使い分ける?

変更が不要なデータや、変更されたくないデータにはタプルを使います(座標、定数など)。

後から要素を追加・削除・変更する可能性があるデータにはリストを使います。

迷ったらリストを使っておけば安全です。

Q2: 辞書のキーにリストは使える?

いいえ、リストは変更可能(ミュータブル)なので、辞書のキーには使えません。

タプルは変更不可(イミュータブル)なので、キーとして使えます。

キーには文字列、数値、タプルなどが使えます。

Q3: []とget()はどちらを使うべき?

キーが必ず存在することが確実な場合は[]でもOKです。

しかし、キーが存在しない可能性がある場合は、get()を使った方が安全です。

get()ならエラーにならず、デフォルト値を返せます。

Q4: 辞書の順序は保証される?

Python 3.7以降では、辞書は挿入順序を保持します。

つまり、追加した順番でキーが並びます。

しかし、順序が重要な場合は、明示的にソートするか、リストで管理することをお勧めします。

Q5: タプルは本当に変更できない?

はい、タプル自体は変更できません。

ただし、タプルの中にリストが含まれている場合、そのリストの内容は変更できます。

例:t = ([1,2],3)t[0].append(4)は可能です。

🎉 ステップ8のまとめ

✅ このステップで学んだこと

✓ タプルは変更できないリスト(丸カッコ () で作成)

✓ タプルのアンパックで複数の変数に一度に代入

✓ 関数から複数の値を返すのにタプルが便利

✓ 辞書はキーと値のペアでデータを管理(波カッコ {} で作成)

✓ 辞書[キー] または get() で値を取得

✓ get() を使うとキーが存在しなくてもエラーにならない

✓ in演算子でキーの存在を確認

✓ items() でキーと値を同時にループ処理

✓ 辞書は追加・変更・削除が可能

💪 次のステップへ

タプルと辞書をマスターしました!

辞書は特に実践的なプログラムでよく使われます。

ユーザー情報の管理、設定データ、APIのレスポンスなど、様々な場面で活躍します。

次のステップでは、条件分岐について学びます。

if文を使って、プログラムの流れを制御する方法を習得しましょう!

📝

学習メモ

Pythonプログラミング基礎 - Step 8

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE