Pythonの辞書はキーと値のペアを格納しますが、その「値」としてさらに別の辞書を格納することもできます。このようにデータ構造の中に同じ種類のデータ構造が入っている形を**入れ子(ネスト)**と呼びます。
入れ子辞書を使うと、より複雑で階層的なデータをエレガントに表現できます。この記事では、入れ子辞書の基本的な構造と、そのデータを処理する方法について解説します。
目次
入れ子辞書の構造
入れ子辞書は、現実世界の階層的なデータをモデル化するのに非常に便利です。例えば、各学生がどの科目を何点取ったかを管理するデータ構造を考えてみましょう。
# 学生の成績を格納する入れ子辞書
# 外側のキーが学生名、値が「科目:点数」の辞書
student_scores = {
"Taro": {"math": 85, "english": 92, "history": 78},
"Hanako": {"math": 95, "science": 88},
"Kenji": {"english": 76, "science": 90, "history": 81}
}
この構造では、外側の辞書のキーが学生名(例:"Taro"
)、その値が科目と点数を格納した内側の辞書(例:{"math": 85, ...}
)になっています。
特定のデータにアクセスするには、キーを2回指定します。
# Taroの数学の点数にアクセス
taro_math_score = student_scores["Taro"]["math"]
print(f"Taroの数学の点数は {taro_math_score} 点です。") # 出力: 85
入れ子辞書を処理する関数
このような構造化されたデータから、特定の情報を集計する関数を作成してみましょう。ここでは、全生徒の特定の科目の合計点数を計算する関数calculate_total_score
を作成します。
def calculate_total_score(scores_data, subject):
total_score = 0
# scores_data.items()で、外側の辞書のキーと値(内側の辞書)をループ処理
for student_name, scores in scores_data.items():
# 内側の辞書から科目の点数を安全に取得し、合計に加算
# .get(subject, 0)は、もし科目がなければ0を返す
total_score += scores.get(subject, 0)
return total_score
コードの解説
for student_name, scores in scores_data.items():
- このループで、外側の辞書を一つずつ処理します。
student_name
には"Taro"
,"Hanako"
, …が、scores
にはそれぞれの内側の辞書{...}
が入ります。
- このループで、外側の辞書を一つずつ処理します。
total_score += scores.get(subject, 0)
- ここが重要なポイントです。
scores
(内側の辞書)に対して.get(subject, 0)
を使っています。これにより、もしその生徒が指定された科目を受験していなくても(例:Hanakoはenglish
を受験していない)、KeyError
を発生させることなく、0
点として安全に集計できます。
- ここが重要なポイントです。
関数の実行と結果
作成した関数を使って、各科目の合計点数を表示してみましょう。
print("--- 全生徒の科目別合計点数 ---")
# 数学の合計点数を計算
total_math = calculate_total_score(student_scores, "math")
print(f"数学: {total_math} 点")
# 英語の合計点数を計算
total_english = calculate_total_score(student_scores, "english")
print(f"英語: {total_english} 点")
# 理科の合計点数を計算
total_science = calculate_total_score(student_scores, "science")
print(f"理科: {total_science} 点")
実行結果:
--- 全生徒の科目別合計点数 ---
数学: 180 点
英語: 168 点
理科: 178 点
まとめ
- 入れ子辞書は、辞書の値としてさらに辞書を持つことで、複雑なデータを階層的に管理できます。
- 入れ子になったデータにアクセスするには、
my_dict[outer_key][inner_key]
のようにキーを連ねて指定します。 - 入れ子辞書をループ処理する際は、内側の辞書にキーが存在しない可能性を考慮し、
.get()
メソッドを使うと安全で堅牢なコードになります。
入れ子辞書は、APIから取得したJSONデータや、複雑な設定情報の管理など、実用的なプログラミングの多くの場面で活用される強力なテクニックです。