📦 ステップ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