データを読み込み中...

この教材では、Pythonの重要なデータ構造である「辞書(dict)」について学びます。前回学んだリストは「順番」でデータを管理しましたが、辞書は「名前」でデータを管理します。
前回の教材でリストを学びました。リストは複数のデータを管理するのに便利でしたが、1つ問題がありました。
例えば、クラスメイトの電話番号を管理することを考えてみましょう。
# リストで管理すると...
names = ["田中", "佐藤", "鈴木", "高橋"]
phones = ["090-1111-2222", "080-3333-4444", "090-5555-6666", "080-7777-8888"]
# 佐藤さんの電話番号を知りたい
# まず佐藤さんが何番目かを探す必要がある
for i, name in enumerate(names):
if name == "佐藤":
print(phones[i])
break
これは面倒ですね。「佐藤」という名前から、直接電話番号を取り出せたら便利です。
辞書を使えば、このように書けます。
# 辞書で管理すると...
phone_book = {
"田中": "090-1111-2222",
"佐藤": "080-3333-4444",
"鈴木": "090-5555-6666",
"高橋": "080-7777-8888"
}
# 佐藤さんの電話番号を直接取得
print(phone_book["佐藤"]) # 080-3333-4444
とてもシンプルになりました!
辞書とは、キー(key)と値(value)のペアでデータを管理する仕組みです。
実世界の辞書を思い浮かべてください。
プログラムの辞書も同じです。
# 基本的な辞書の構造
辞書 = {
"キー1": "値1",
"キー2": "値2",
"キー3": "値3"
}
リストと辞書の最大の違いは「何で要素を特定するか」です。
リストの場合:
students = ["田中", "佐藤", "鈴木"]
# 番号(インデックス)で取り出す
print(students[0]) # 田中
print(students[1]) # 佐藤
リストは「0番目、1番目、2番目...」という順番が重要です。
辞書の場合
scores = {
"田中": 85,
"佐藤": 92,
"鈴木": 78
}
# 名前(キー)で取り出す
print(scores["田中"]) # 85
print(scores["佐藤"]) # 92
辞書は順番は関係なく、キーで直接アクセスします。
どちらを使うべきか?
リスト:順番が意味を持つ場合
辞書:名前や識別子でデータを引きたい場合
辞書は波括弧{}を使って作成します
# 空の辞書
empty_dict = {}
# キーと値のペアを持つ辞書
user = {
"name": "田中太郎",
"age": 25,
"city": "東京"
}
# 数値をキーにすることもできる(ロッカー番号など)
lockers = {
101: "田中",
102: "佐藤",
103: "鈴木"
}
重要なポイント
:(コロン)で区切る,(カンマ)で区切る辞書の値を取り出すには、キーを使います。
user = {
"name": "田中太郎",
"age": 25,
"city": "東京"
}
print(user["name"]) # 田中太郎
print(user["age"]) # 25
print(user["city"]) # 東京
リストがlist[0]のように数字でアクセスするのに対し、辞書はdict["キー"]のように名前でアクセスします。
存在しないキーにアクセスしようとすると、エラーになります。
user = {
"name": "田中太郎",
"age": 25
}
# print(user["email"]) # KeyError: 'email'
これを避けるには、get()メソッドを使います。
user = {
"name": "田中太郎",
"age": 25
}
# キーが存在しない場合、Noneを返す
email = user.get("email")
print(email) # None
# デフォルト値を指定することもできる
email = user.get("email", "未登録")
print(email) # 未登録
in演算子を使って、キーが存在するか確認できます。
user = {
"name": "田中太郎",
"age": 25
}
if "email" in user:
print(user["email"])
else:
print("メールアドレスが登録されていません")
辞書に新しいキーと値のペアを追加するには、単純に代入します。
user = {
"name": "田中太郎",
"age": 25
}
# 新しい要素を追加
user["email"] = "tanaka@example.com"
user["phone"] = "090-1234-5678"
print(user)
# {'name': '田中太郎', 'age': 25, 'email': 'tanaka@example.com', 'phone': '090-1234-5678'}
既存のキーに値を代入すると、値が上書きされます。
user = {
"name": "田中太郎",
"age": 25,
"city": "東京"
}
# 年齢を更新
user["age"] = 26
# 住所を変更
user["city"] = "大阪"
print(user)
# {'name': '田中太郎', 'age': 26, 'city': '大阪'}
del文を使って、キーと値のペアを削除できます。
user = {
"name": "田中太郎",
"age": 25,
"city": "東京",
"temp": "一時データ"
}
# 不要な要素を削除
del user["temp"]
print(user)
# {'name': '田中太郎', 'age': 25, 'city': '東京'}
# 商品在庫を辞書で管理
inventory = {
"A001": 50,
"B002": 30,
"C003": 0
}
print("=== 初期在庫 ===")
print(inventory)
# 新商品を追加
inventory["D004"] = 20
print("\n新商品D004を追加しました")
# 商品A001が10個売れた
inventory["A001"] -= 10
print("商品A001が10個売れました")
# 商品C003が入荷して50個追加
inventory["C003"] += 50
print("商品C003が入荷しました")
print("\n=== 現在の在庫 ===")
print(inventory)
# 在庫切れ商品をチェック
print("\n=== 在庫切れ商品 ===")
for product_code, stock in inventory.items():
if stock == 0:
print("商品コード: {}".format(product_code))
keys()は、辞書のすべてのキーを取得します。
scores = {
"田中": 85,
"佐藤": 92,
"鈴木": 78
}
# すべてのキーを取得
print(scores.keys()) # dict_keys(['田中', '佐藤', '鈴木'])
# リストに変換
name_list = list(scores.keys())
print(name_list) # ['田中', '佐藤', '鈴木']
values()は、辞書のすべての値を取得します。
scores = {
"田中": 85,
"佐藤": 92,
"鈴木": 78
}
# すべての値を取得
print(scores.values()) # dict_values([85, 92, 78])
# リストに変換
score_list = list(scores.values())
print(score_list) # [85, 92, 78]
# 合計や平均の計算に使える
total = sum(scores.values())
average = total / len(scores)
print("平均点: ".format(average)) # 平均点: 85.0
items()は、キーと値のペアをタプルとして取得します。
scores = {
"田中": 85,
"佐藤": 92,
"鈴木": 78
}
# すべてのキーと値のペアを取得
print(scores.items())
# dict_items([('田中', 85), ('佐藤', 92), ('鈴木', 78)])
# リストに変換
items_list = list(scores.items())
print(items_list)
# [('田中', 85), ('佐藤', 92), ('鈴木', 78)]
辞書をそのままfor文で回すと、キーが取得できます。
scores = {
"田中": 85,
"佐藤": 92,
"鈴木": 78
}
# キーでループ
for name in scores:
print(name)
# 田中
# 佐藤
# 鈴木
# キーを使って値も取得できる
for name in scores:
print("{}: {}点".format(name, scores[name]))
# 田中: 85点
# 佐藤: 92点
# 鈴木: 78点
キーと値の両方が必要な場合は、items()を使う方が読みやすいです。
scores = {
"田中": 85,
"佐藤": 92,
"鈴木": 78
}
for name, score in scores.items():
print("{}: {}点".format(name, score))
# 田中: 85点
# 佐藤: 92点
# 鈴木: 78点
scores = {
"田中": 85,
"佐藤": 92,
"鈴木": 78,
"高橋": 65,
"伊藤": 58
}
print("=== 成績判定 ===")
for name, score in scores.items():
if score >= 80:
grade = "優"
elif score >= 70:
grade = "良"
elif score >= 60:
grade = "可"
else:
grade = "不可"
print("{}: {}点 ({})".format(name, score, grade))
# 合格者(60点以上)をカウント
passed = 0
for score in scores.values():
if score >= 60:
passed += 1
print("\n合格者: {}人".format(passed))
リストと同様に、辞書も内包表記で作成できます。
# 1から5までの数値とその2乗を辞書にする
squares = {n: n**2 for n in range(1, 6)}
print(squares)
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 既存の辞書から条件に合うものだけを抽出
scores = {
"田中": 85,
"佐藤": 92,
"鈴木": 78,
"高橋": 65
}
# 80点以上だけを抽出
high_scores = {name: score for name, score in scores.items() if score >= 80}
print(high_scores)
# {'田中': 85, '佐藤': 92}
以下の要件を満たすプログラムを作成してください。
要件
menuを作成する期待する出力例
ラーメン: 850円
チャーハン: 700円
餃子: 400円
メニュー数: 3
ヒント
menu["キー"] = 値以下の要件を満たすプログラムを作成してください。
要件
votes = ["A", "B", "A", "C", "B", "A", "D", "B", "A", "C"]を作成する(投票結果)vote_countを作成する期待する出力例
A: 4票
B: 3票
C: 2票
D: 1票
最多得票: A
ヒント
if choice in vote_count:で存在確認以下の要件を満たすプログラムを作成してください。
要件
products = {
"P001": {"name": "ノート", "price": 200, "stock": 50},
"P002": {"name": "ペン", "price": 150, "stock": 0},
"P003": {"name": "消しゴム", "price": 100, "stock": 30}
}
期待する出力例
P001: ノート - 200円 (在庫: 50個)
P002: ペン - 150円 (在庫: 0個)
P003: 消しゴム - 100円 (在庫: 30個)
在庫切れ商品
ペン
在庫合計: 80個
ヒント
products[code]["name"]のようにアクセス以下の要件を満たすプログラムを作成してください。
要件
customersを作成する(顧客IDをキー、顧客情報を値とする)期待する動作例
=== 顧客管理システム ===
1: 顧客追加
2: 顧客情報表示
3: 全顧客一覧
4: 終了
選択: 1
顧客ID: C001
顧客名: 田中太郎
顧客を追加しました
選択: 1
顧客ID: C002
顧客名: 佐藤花子
顧客を追加しました
選択: 3
=== 全顧客一覧 ===
C001: 田中太郎
C002: 佐藤花子
選択: 2
顧客ID: C001
ID: C001
名前: 田中太郎
選択: 4
システムを終了します
ヒント
customers[id] = nameで保存if id in customers:この教材では、以下の内容を学習しました
{キー: 値}の形式で作成dict[キー] = 値で追加・変更del dict[キー]で削除キー in dictで存在確認dict.get(キー, デフォルト値)で安全に取得keys(): すべてのキーを取得values(): すべての値を取得items(): キーと値のペアを取得次の教材では、関数の定義と活用について学習します。これまで学んだリスト、辞書、ループなどを組み合わせて、より実践的なプログラムを作れるようになります。演習問題をしっかり解いて、辞書の使い方をマスターしましょう。