- Day 9:辞書・タプル・セット ― 「“構造”を意識してデータを整理する」
- 辞書 ― 「キーと値のペアで“意味のある情報”を持つ」
- 辞書の追加・更新・削除 ― 「情報を増やす・変える・消す」
- keys() / values() / items() ― 「辞書の中身を一覧で見る」
- タプル ― 「変更できない“並び”を表す」
- セット ― 「重複なしの“集まり”と集合演算」
- Day 9のまとめと次へのつながり
- Day 9:辞書・タプル・セットで「簡易住所録」を作る
- 辞書で1人分の住所情報を表現する
- 住所録全体を「辞書の辞書」で持つ
- 住所録への追加・更新・削除
- keys() / values() / items() で住所録を一覧する
- タプルで「変わらない情報」を表現する
- セットで「重複のない集まり」と「集合演算」を使う
- Day 9(制作編)のまとめ
Day 9:辞書・タプル・セット ― 「“構造”を意識してデータを整理する」
Day 9では、「辞書・タプル・セット」という3つのデータ構造を扱います。 リストだけでも多くのことができますが、データの性質に合わせて構造を選ぶことで、コードが読みやすく・安全で・拡張しやすくなります。 ここでは、辞書(キーと値のペア)、タプル(変更不可の並び)、セット(重複なしの集まり)を、ステップバイステップで見ていきます。
辞書 ― 「キーと値のペアで“意味のある情報”を持つ」
辞書(dict)は、「キーと値のペア」をまとめて持つためのデータ構造です。 角括弧 [] のリストと違い、波括弧 {} を使い、キー: 値 の形で書きます。
# 辞書の基本的な作成
user = {
"name": "alice", # キー"name"に値"alice"
"age": 25, # キー"age"に値25
"is_admin": False # キー"is_admin"に値False
}
print(user)
Python辞書は、「名前付きの情報」を扱うときに非常に便利です。 例えば、ユーザー情報、設定値、レスポンスデータなどを、そのまま辞書で表現できます。
キーと値 ― 「“何を表すか”と“その中身”」
辞書の「キー」は、「その値が何を表しているか」を示すラベルです。 「値」は、そのラベルに対応する実際のデータです。
# キーを使って値を取得する
print(user["name"]) # 'alice'
print(user["age"]) # 25
print(user["is_admin"]) # False
Pythonここで重要なのは、「辞書はインデックスではなくキーでアクセスする」という点です。 リストは「0番目、1番目…」という位置でアクセスしましたが、辞書は「’name’」「’age’」といったキーでアクセスします。
セキュリティの観点では、「ユーザーの権限情報」「認証状態」「設定フラグ」などを辞書で持つことが多いです。
# ユーザーの権限情報を辞書で持つ例
user = {
"name": "alice",
"role": "admin",
"is_authenticated": True
}
if user["is_authenticated"] and user["role"] == "admin":
print("管理者として操作を許可します")
else:
print("操作は制限されます")
Python辞書の追加・更新・削除 ― 「情報を増やす・変える・消す」
辞書は、後からキーと値を追加したり、既存の値を更新したり、削除したりできます。
追加 ― 「新しいキーと値を足す」
# 辞書に新しいキーと値を追加する
user = {"name": "alice"}
user["age"] = 25 # 新しいキー"age"を追加
user["is_admin"] = False # 新しいキー"is_admin"を追加
print(user) # {'name': 'alice', 'age': 25, 'is_admin': False}
Python存在しないキーに代入すると「追加」、存在するキーに代入すると「更新」になります。
更新 ― 「既存のキーの値を変更する」
# 辞書の値を更新する
user = {
"name": "alice",
"age": 25,
"is_admin": False
}
user["age"] = 26 # 年齢を更新
user["is_admin"] = True # 管理者フラグを更新
print(user) # {'name': 'alice', 'age': 26, 'is_admin': True}
Python更新は、「状態が変わった」「設定を変更した」といった場面で使います。
削除 ― 「いらなくなったキーと値を取り除く」
削除には del を使います。
# 辞書からキーと値を削除する
user = {
"name": "alice",
"age": 25,
"is_admin": False
}
del user["age"] # "age"キーとその値を削除
print(user) # {'name': 'alice', 'is_admin': False}
Python存在しないキーを削除しようとするとエラーになるので、実際のコードでは in で存在チェックをすることが多いです。
# 安全に削除する例
key_to_delete = "age"
if key_to_delete in user:
del user[key_to_delete]
Pythonkeys() / values() / items() ― 「辞書の中身を一覧で見る」
辞書には、「キーだけ」「値だけ」「キーと値のペア」をまとめて取り出すためのメソッドがあります。
keys() ― 「すべてのキーを取り出す」
# keys()でキー一覧を取得する
user = {
"name": "alice",
"age": 25,
"is_admin": False
}
print(user.keys()) # dict_keys(['name', 'age', 'is_admin'])
# for文で回すこともできます
for key in user.keys():
print(f"キー: {key}")
Pythonvalues() ― 「すべての値を取り出す」
# values()で値一覧を取得する
for value in user.values():
print(f"値: {value}")
Pythonitems() ― 「キーと値のペアをまとめて取り出す」
items() は、「(キー, 値) のペア」を順番に取り出せるメソッドです。
# items()でキーと値を同時に扱う
for key, value in user.items():
print(f"{key} = {value}")
Pythonセキュリティ寄りのイメージとして、「設定値をすべてログに出す」例を見てみます。
# 設定値を一覧表示する例
config = {
"max_login_attempts": 5,
"lockout_minutes": 30,
"enable_2fa": True
}
for key, value in config.items():
print(f"設定 {key}: {value}")
Pythonタプル ― 「変更できない“並び”を表す」
タプル(tuple)は、「リストに似ているが、変更できない並び」です。 丸括弧 () を使って作ります。
# タプルの基本的な作成
point = (10, 20) # 座標(x, y)のイメージ
print(point)
Python要素の取得はリストと同じくインデックスで行います。
print(point[0]) # 10
print(point[1]) # 20
Pythonただし、タプルは「変更できない」という性質があります。
# 次の行はエラーになります(タプルは変更不可)
# point[0] = 30
Python基本操作 ― 「取り出すことはできるが、追加・削除・更新はできない」
タプルは、「一度決めたら変わらない値の集まり」を表すのに向いています。 例えば、「緯度・経度」「設定の固定ペア」「戻り値の複数値」などです。
# 関数の戻り値としてタプルを使う例
def get_status():
# ステータスコードとメッセージを返すイメージ
return (200, "OK")
status_code, message = get_status()
print(status_code) # 200
print(message) # OK
Pythonリストとの違い ― 「変わるものはリスト、変わらないものはタプル」
リストとタプルの主な違いは、「変更できるかどうか」です。
- リスト:
[]、要素の追加・削除・更新が可能 - タプル:
()、一度作ったら中身を変更できない
セキュリティの観点では、「変わってはいけない設定値」「固定のロール一覧」などをタプルで表現することで、誤って変更してしまうリスクを減らせます。
# 固定のロール一覧をタプルで表現する例
ROLES = ("user", "admin", "superadmin") # 変更しない前提の定数
print(ROLES)
# ROLES[0] = "guest" # こうしようとするとエラーになります
Pythonセット ― 「重複なしの“集まり”と集合演算」
セット(set)は、「重複を許さない集まり」を表すデータ構造です。 波括弧 {} を使いますが、辞書とは違い「キー: 値」ではなく「値だけ」を並べます。
# セットの基本的な作成
fruits = {"apple", "banana", "orange", "apple"} # 'apple'が重複しています
print(fruits) # {'apple', 'banana', 'orange'} のように重複が除かれます
Pythonセットは、「同じ値が何度入っても、1つとして扱う」という性質があります。
重複除去 ― 「リストから重複を取り除く」
セットは、「重複を取り除きたい」ときに非常に便利です。
# リストから重複を除去する例
emails = [
"a@example.com",
"b@example.com",
"a@example.com", # 重複
"c@example.com"
]
unique_emails = set(emails) # セットに変換して重複を除去
print(unique_emails) # {'a@example.com', 'b@example.com', 'c@example.com'}
Python必要なら、再びリストに戻すこともできます。
unique_emails_list = list(unique_emails)
print(unique_emails_list)
Pythonセキュリティの観点では、「重複したIPアドレスを1つにまとめる」「同じユーザーを何度も処理しないようにする」といった場面でセットが役立ちます。
集合演算 ― 「共通部分・差分・和を求める」
セットは、「集合演算」が得意です。 代表的なのは次の3つです。
- 共通部分(積集合):
& - 和(和集合):
| - 差分:
-
# 集合演算の基本
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
# 共通部分(両方に含まれる要素)
intersection = set_a & set_b
print("共通部分:", intersection) # {3, 4}
# 和(どちらかに含まれる要素すべて)
union = set_a | set_b
print("和:", union) # {1, 2, 3, 4, 5, 6}
# 差分(set_aにだけ含まれる要素)
difference = set_a - set_b
print("差分:", difference) # {1, 2}
Pythonセキュリティ寄りのイメージとして、「ブラックリストとアクセスログの共通部分を調べる」例を見てみます。
# ブラックリストIPとアクセスIPの共通部分を調べる例
blacklist_ips = {"10.0.0.1", "10.0.0.2", "192.168.1.10"}
access_ips = {"192.168.1.10", "192.168.1.20", "10.0.0.3"}
suspicious_ips = blacklist_ips & access_ips # 共通部分
print("ブラックリストに載っているアクセス元IP:", suspicious_ips)
Pythonここでは、「ブラックリストに載っていて、かつアクセスしてきたIP」を集合演算で簡潔に求めています。
Day 9のまとめと次へのつながり
Day 9では、
- 辞書(dict):キーと値のペアで意味のある情報を持つ
- キーで値を取得する
- 追加・更新・削除ができる
keys()・values()・items()で中身を一覧できる
- タプル(tuple):変更できない並び
- インデックスで要素を取得できる
- 一度作ったら中身を変えない前提のデータに向いている
- セット(set):重複なしの集まり
- 重複除去に便利
- 集合演算(共通部分・和・差分)が得意
を学びました。
ここまで理解できると、「データの性質に合わせて構造を選ぶ」という、プログラムの“設計力”が一段階上がります。 次のステップでは、リスト・辞書・タプル・セットを組み合わせて、より現実的なデータ処理(ログ解析、ユーザー管理、設定管理など)に進んでいきます。
Day 9で特に重要なのは、「辞書は“名前付きの情報”、タプルは“変わらない並び”、セットは“重複なしの集まり”」という3つのイメージです。 この感覚が身につくと、セキュリティ的にも「権限情報を辞書で整理する」「固定のロールをタプルで守る」「ブラックリストをセットで効率的に扱う」といった設計を、自然に安全に行えるようになっていきます。
Day 9:辞書・タプル・セットで「簡易住所録」を作る
Day 9の制作編では、「簡易住所録」を題材にして、辞書・タプル・セットを実際の形に落とし込んでいきます。 住所録は「名前」「住所」「電話番号」など、意味のある情報のまとまりを扱うので、辞書との相性がとても良い題材です。 さらに、タプルで「変わらない情報」を表現したり、セットで「重複のない集まり」や「集合演算」を使ったりしながら、現実的なデータ構造の使い方を体験していきます。
辞書で1人分の住所情報を表現する
まずは、「1人分の住所情報」を辞書で表現してみます。 辞書は「キー」と「値」のペアで情報を持つので、「name」「address」「phone」といったキーを使うと分かりやすくなります。
# 1人分の住所情報を辞書で表現する
person = {
"name": "山田太郎", # 名前
"address": "東京都渋谷区〇〇", # 住所
"phone": "090-1234-5678" # 電話番号
}
print(person)
Pythonここで重要なのは、「キーが情報の意味を表している」という点です。 person["name"] と書けば「名前」、person["address"] と書けば「住所」と、コードを読んだだけで何を扱っているか分かります。
辞書から値を取り出すときは、キーを指定します。
# キーを使って値を取得する
print("名前:", person["name"])
print("住所:", person["address"])
print("電話番号:", person["phone"])
Pythonこのように、辞書は「意味のある情報のまとまり」を扱うのに非常に向いています。
住所録全体を「辞書の辞書」で持つ
次に、「複数人分の住所情報」をまとめて管理するために、 「住所録全体」を辞書で持つ形にしてみます。 ここでは、「キーをメールアドレス」「値をその人の情報(辞書)」という構造にします。
# 簡易住所録(複数人分)を辞書で表現する
address_book = {
"taro@example.com": {
"name": "山田太郎",
"address": "東京都渋谷区〇〇",
"phone": "090-1234-5678"
},
"hanako@example.com": {
"name": "佐藤花子",
"address": "神奈川県横浜市△△",
"phone": "080-9876-5432"
}
}
print(address_book)
Pythonここでは、
メールアドレスが「住所録のキー」 その人の情報(名前・住所・電話)が「値(辞書)」
という二重構造になっています。 この形にしておくと、「メールアドレスからその人の情報をすぐに取り出せる」住所録になります。
住所録への追加・更新・削除
住所録は、「人を追加する」「住所を更新する」「削除する」といった操作が必要になります。 それぞれ辞書の操作で自然に書けます。
追加:新しい人を住所録に登録する
# 新しい人を住所録に追加する
new_email = "jiro@example.com"
new_person = {
"name": "鈴木次郎",
"address": "千葉県千葉市□□",
"phone": "070-1111-2222"
}
address_book[new_email] = new_person # 新しいキーと値を追加
print("追加後の住所録:", address_book)
Python存在しないキーに代入すると「追加」になります。 これで、jiro@example.com の人が住所録に登録されました。
更新:既存の人の情報を変更する
例えば、「山田太郎の住所が変わった」場合を考えます。
# 既存の人の住所を更新する
email = "taro@example.com"
if email in address_book:
address_book[email]["address"] = "東京都新宿区☆☆" # 住所を更新
print("更新後の山田太郎の情報:", address_book[email])
else:
print("指定されたメールアドレスは住所録に存在しません")
Pythonここでは、「住所録にそのメールアドレスが存在するか」を in で確認してから更新しています。 こうした存在チェックは、エラーを防ぐうえで重要です。
削除:住所録から人を削除する
削除には del を使います。
# 住所録から人を削除する
email_to_delete = "hanako@example.com"
if email_to_delete in address_book:
del address_book[email_to_delete]
print("削除後の住所録:", address_book)
else:
print("指定されたメールアドレスは住所録に存在しません")
Pythonこのように、辞書のキーを削除することで、その人の情報を住所録から取り除くことができます。
keys() / values() / items() で住所録を一覧する
住所録全体を「一覧表示」したいときには、keys()・values()・items() が役立ちます。
keys():登録されているメールアドレス一覧
values():人の情報だけを一覧する
# 人の情報だけを一覧表示する
print("登録されている人の情報一覧:")
for person in address_book.values():
print("名前:", person["name"], "住所:", person["address"], "電話:", person["phone"])
Pythonitems():メールアドレスと人の情報をセットで扱う
# メールアドレスと人の情報をセットで表示する
print("住所録の全エントリ:")
for email, person in address_book.items():
print(f"メール: {email} / 名前: {person['name']} / 住所: {person['address']} / 電話: {person['phone']}")
Pythonitems() を使うと、「キー(メールアドレス)と値(人の情報)」を同時に扱えるので、 住所録のような構造には特に便利です。
タプルで「変わらない情報」を表現する
次に、タプルを住所録の中でどう使うかを考えてみます。 タプルは「変更できない並び」なので、「変わるべきではない情報」を表現するのに向いています。
例えば、「都道府県一覧」は基本的に変わりません。 これをタプルで持つと、誤って変更してしまうリスクを減らせます。
# 都道府県一覧をタプルで表現する(例)
PREFECTURES = (
"北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県",
"茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県",
# ... 以下略
)
print("都道府県の一例:", PREFECTURES[:5]) # 先頭5件だけ表示
Pythonタプルはリストと同じようにインデックスでアクセスできますが、更新はできません。
print(PREFECTURES[12]) # '東京都'
# 次の行はエラーになります(タプルは変更不可)
# PREFECTURES[12] = "東京府"
Pythonリストとの違いは、「変更できるかどうか」です。 住所録の中で、「固定の選択肢」「変わらない定数」をタプルで表現すると、 コードの意図がはっきりし、セキュリティ的にも「勝手に書き換えられない」安心感が生まれます。
セットで「重複のない集まり」と「集合演算」を使う
最後に、セットを住所録に絡めて使ってみます。 セットは「重複なしの集まり」なので、「重複を除去したい」「共通部分を知りたい」といった場面で役立ちます。
重複除去:住所録から重複メールアドレスを取り除く
例えば、何らかの理由で「メールアドレスのリスト」に重複がある場合、 セットに変換することで簡単に重複を除去できます。
# 重複を含むメールアドレスのリスト
email_list = [
"taro@example.com",
"hanako@example.com",
"taro@example.com", # 重複
"jiro@example.com"
]
# セットに変換して重複を除去
unique_emails = set(email_list)
print("重複除去後のメールアドレスセット:", unique_emails)
Python必要なら、再びリストに戻すこともできます。
unique_email_list = list(unique_emails)
print("重複除去後のメールアドレスリスト:", unique_email_list)
Python集合演算:2つの住所録の共通部分や差分を調べる
例えば、「旧住所録」と「新住所録」があり、 どのメールアドレスが共通しているか、どのメールアドレスが新しく追加されたかを知りたいとします。
# 旧住所録と新住所録のメールアドレス集合を作る
old_address_book_emails = {"taro@example.com", "hanako@example.com", "jiro@example.com"}
new_address_book_emails = {"taro@example.com", "jiro@example.com", "sakura@example.com"}
# 共通部分(両方に存在するメールアドレス)
common_emails = old_address_book_emails & new_address_book_emails
print("両方の住所録に存在するメールアドレス:", common_emails)
# 新住所録にだけ存在するメールアドレス(新規追加)
new_only_emails = new_address_book_emails - old_address_book_emails
print("新しく追加されたメールアドレス:", new_only_emails)
# 旧住所録にだけ存在するメールアドレス(削除された可能性)
old_only_emails = old_address_book_emails - new_address_book_emails
print("新住所録に存在しない(削除された可能性のある)メールアドレス:", old_only_emails)
Pythonこのように、セットの集合演算を使うと、「共通」「差分」「和」を簡潔に表現できます。 住所録のようなデータでも、「どのエントリが増えたか・減ったか」を安全に把握するのに役立ちます。
Day 9(制作編)のまとめ
Day 9の制作編では、「簡易住所録」を題材にして、
辞書で「1人分の情報」と「住所録全体」を表現する キー(メールアドレス)と値(人の情報)で追加・更新・削除を行う keys()・values()・items()で住所録を一覧する タプルで「変わらない情報(都道府県一覧など)」を安全に表現する セットで「重複除去」や「集合演算(共通・差分)」を使って住所録の変化を把握する
という流れを体験していただきました。
ここまで来ると、「データの性質に合わせて構造を選ぶ」という感覚がかなり育ってきているはずです。 辞書・タプル・セットを使い分けることで、住所録のような現実的なデータも、 読みやすく・安全で・拡張しやすい形でコードに落とし込めるようになります。
