基礎から学ぶPython入門 90日コース | Python基礎 - Day 9:辞書・タプル・セット

Python 90日で身につけるPython
スポンサーリンク
スポンサーリンク
  1. Day 9:辞書・タプル・セット ― 「“構造”を意識してデータを整理する」
  2. 辞書 ― 「キーと値のペアで“意味のある情報”を持つ」
    1. キーと値 ― 「“何を表すか”と“その中身”」
  3. 辞書の追加・更新・削除 ― 「情報を増やす・変える・消す」
    1. 追加 ― 「新しいキーと値を足す」
    2. 更新 ― 「既存のキーの値を変更する」
    3. 削除 ― 「いらなくなったキーと値を取り除く」
  4. keys() / values() / items() ― 「辞書の中身を一覧で見る」
    1. keys() ― 「すべてのキーを取り出す」
    2. values() ― 「すべての値を取り出す」
    3. items() ― 「キーと値のペアをまとめて取り出す」
  5. タプル ― 「変更できない“並び”を表す」
    1. 基本操作 ― 「取り出すことはできるが、追加・削除・更新はできない」
    2. リストとの違い ― 「変わるものはリスト、変わらないものはタプル」
  6. セット ― 「重複なしの“集まり”と集合演算」
    1. 重複除去 ― 「リストから重複を取り除く」
    2. 集合演算 ― 「共通部分・差分・和を求める」
  7. Day 9のまとめと次へのつながり
  8. Day 9:辞書・タプル・セットで「簡易住所録」を作る
  9. 辞書で1人分の住所情報を表現する
  10. 住所録全体を「辞書の辞書」で持つ
  11. 住所録への追加・更新・削除
    1. 追加:新しい人を住所録に登録する
    2. 更新:既存の人の情報を変更する
    3. 削除:住所録から人を削除する
  12. keys() / values() / items() で住所録を一覧する
    1. keys():登録されているメールアドレス一覧
    2. values():人の情報だけを一覧する
    3. items():メールアドレスと人の情報をセットで扱う
  13. タプルで「変わらない情報」を表現する
  14. セットで「重複のない集まり」と「集合演算」を使う
    1. 重複除去:住所録から重複メールアドレスを取り除く
    2. 集合演算:2つの住所録の共通部分や差分を調べる
  15. 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]
Python

keys() / 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}")
Python

values() ― 「すべての値を取り出す」

# values()で値一覧を取得する

for value in user.values():
    print(f"値: {value}")
Python

items() ― 「キーと値のペアをまとめて取り出す」

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():登録されているメールアドレス一覧

Python

values():人の情報だけを一覧する

# 人の情報だけを一覧表示する

print("登録されている人の情報一覧:")
for person in address_book.values():
    print("名前:", person["name"], "住所:", person["address"], "電話:", person["phone"])
Python

items():メールアドレスと人の情報をセットで扱う

# メールアドレスと人の情報をセットで表示する

print("住所録の全エントリ:")
for email, person in address_book.items():
    print(f"メール: {email} / 名前: {person['name']} / 住所: {person['address']} / 電話: {person['phone']}")
Python

items() を使うと、「キー(メールアドレス)と値(人の情報)」を同時に扱えるので、 住所録のような構造には特に便利です。

タプルで「変わらない情報」を表現する

次に、タプルを住所録の中でどう使うかを考えてみます。 タプルは「変更できない並び」なので、「変わるべきではない情報」を表現するのに向いています。

例えば、「都道府県一覧」は基本的に変わりません。 これをタプルで持つと、誤って変更してしまうリスクを減らせます。

# 都道府県一覧をタプルで表現する(例)

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()で住所録を一覧する タプルで「変わらない情報(都道府県一覧など)」を安全に表現する セットで「重複除去」や「集合演算(共通・差分)」を使って住所録の変化を把握する

という流れを体験していただきました。

ここまで来ると、「データの性質に合わせて構造を選ぶ」という感覚がかなり育ってきているはずです。 辞書・タプル・セットを使い分けることで、住所録のような現実的なデータも、 読みやすく・安全で・拡張しやすい形でコードに落とし込めるようになります。

タイトルとURLをコピーしました