Pythonで辞書をネスト(入れ子)構造にする方法!多階層データの扱い方を学ぼう
生徒
「Pythonで複数の情報をひとつの辞書にまとめることってできますか?」
先生
「できますよ。辞書の中にさらに辞書を入れる『ネスト(入れ子)構造』を使うと、階層的なデータを扱えます。」
生徒
「ネストってちょっと難しそうです…。どんなふうに書くんですか?」
先生
「心配いりません。実例を交えて、ひとつずつわかりやすく解説していきましょう!」
1. ネストされた辞書とは?
Python(パイソン)の辞書(dictionary)は、「キー」と「値」のペアを格納するデータ型です。その値の部分に、さらに辞書を入れることでネストされた辞書(入れ子構造)が作れます。
たとえば、あるクラスの生徒の情報(名前・年齢・成績)をまとめたいとき、それぞれの生徒ごとに辞書を作り、それをクラス全体の辞書に入れる形です。
具体的なコード例で見てみましょう。
students = {
"001": {"name": "太郎", "age": 15, "score": 85},
"002": {"name": "花子", "age": 14, "score": 90},
"003": {"name": "次郎", "age": 15, "score": 78}
}
このように、辞書の中にさらに辞書を入れることで、多くの情報を階層的に整理できます。
2. ネストされた辞書の値を取り出す方法
ネストされた辞書では、まず外側の辞書のキーを指定し、次に内側のキーを指定してアクセスします。
# 花子さんの年齢を取得
print(students["002"]["age"])
14
このように、角かっこ([])を2回使って、順番にキーを指定することで、ネストされた値にもアクセスできます。
3. ネストされた辞書の値を変更・追加する方法
辞書の中の辞書の値を変更するには、アクセスしたあとに値を代入します。新しい情報を追加することもできます。
# 次郎の成績を更新
students["003"]["score"] = 82
# 太郎に住所の情報を追加
students["001"]["address"] = "東京都"
このように、辞書の中の辞書にアクセスして、新しいキーと値を追加すれば、情報をどんどん増やせます。
4. ネストされた辞書をfor文で処理する
ネストされた辞書を扱う際は、for文で繰り返し処理を行うこともよくあります。ここでは、各生徒の名前と成績を表示する例を紹介します。
for student_id, info in students.items():
print(f"{info['name']}さんの成績は{info['score']}点です。")
太郎さんの成績は85点です。
花子さんの成績は90点です。
次郎さんの成績は82点です。
このように、items()メソッドを使えば、キーと値(この場合は内部の辞書)をセットで取り出して処理できます。
5. ネスト辞書の活用例と注意点
ネストされた辞書は、JSON形式のデータを扱うときや、設定ファイルの情報を整理するときにもよく使われます。
ただし、階層が深くなりすぎると読みにくくなるため、見やすく設計することが大切です。また、キーの綴りミスや、存在しないキーへのアクセスによってエラーが出ることもあるため、気をつけましょう。
安全にアクセスするにはget()を使う方法もあります。
# 存在しないキーにアクセスしてもエラーにならない
print(students["002"].get("nickname", "ニックネームなし"))
ニックネームなし
このように、エラーを防ぎながらデータにアクセスすることも可能です。
まとめ
今回の記事では、Pythonの辞書をネスト(入れ子)構造にして、多階層のデータを整理・管理する方法について学びました。 辞書は「キー」と「値」をセットで管理できる便利なデータ型ですが、その値にさらに辞書を入れることで、より現実的で複雑な情報構造を表現できます。
ネストされた辞書は、生徒情報・ユーザー情報・設定ファイル・JSONデータなど、実務や学習のさまざまな場面で使われています。 単純な辞書では表現しにくい「グループ」「カテゴリ」「階層構造」を持つデータを、Pythonの辞書を使って自然に表現できる点が大きなメリットです。
記事の中では、まず「辞書の中に辞書を入れる」という基本的な考え方を確認しました。 外側の辞書が全体を管理し、内側の辞書が詳細情報を持つことで、データを整理しやすくなります。 これは、フォルダとファイルの関係や、学校と生徒名簿の関係に近いイメージです。
また、ネストされた辞書の値の取り出し方についても重要なポイントでした。 外側のキー → 内側のキーという順番で角かっこを使ってアクセスすることで、必要なデータを正確に取得できます。 この考え方は、Pythonの辞書操作を理解する上で欠かせない基本です。
さらに、ネストされた辞書の値の更新や新しい要素の追加も学びました。 すでに存在するキーの値を変更するだけでなく、新しいキーと値を追加することで、後から情報を拡張できる点は、辞書の大きな強みです。
for文とitems()メソッドを組み合わせることで、ネストされた辞書をまとめて処理できることも確認しました。
これにより、全データを一覧表示したり、条件に応じて処理したりすることが可能になります。
実際のプログラムでは、この繰り返し処理が非常によく使われます。
一方で、ネスト構造には注意点もあります。 階層が深くなりすぎるとコードが読みにくくなり、ミスが増えやすくなります。 そのため、必要以上にネストしない設計や、キー名をわかりやすくする工夫が大切です。
また、存在しないキーにアクセスするとエラーになる点にも注意が必要です。
その対策として、get()メソッドを使うことで、安全に値を取得できることを学びました。
これは、実務やアプリ開発でエラーを防ぐために非常に重要なテクニックです。
以下は、今回学んだ内容を活かしたネスト辞書のサンプルプログラムです。 複数階層のデータを扱う流れを、あらためて確認してみましょう。
users = {
"user01": {
"name": "佐藤",
"age": 28,
"skills": {
"python": "中級",
"java": "初級"
}
},
"user02": {
"name": "鈴木",
"age": 35,
"skills": {
"python": "上級",
"javascript": "中級"
}
}
}
# ユーザー情報を表示
for user_id, info in users.items():
print(f"{info['name']}さん({info['age']}歳)")
for lang, level in info["skills"].items():
print(f" {lang}: {level}")
このように、辞書をネストすることで、現実の情報構造に近い形でデータを管理できます。 Pythonの辞書は非常に柔軟なので、学習を進めるほど活用の幅が広がります。
生徒:
「最初は辞書の中に辞書を入れるって難しそうだと思っていましたが、実際に見てみると意外とわかりやすいですね。」
先生:
「そうですね。外側と内側を分けて考えると、整理しやすくなります。現実の情報をそのまま形にできるのがネスト辞書の良さですよ。」
生徒:
「for文でまとめて処理できるのも便利だと思いました。データが増えても対応できそうです。」
先生:
「その通りです。特にユーザー情報や設定データでは、ネスト構造とループ処理の組み合わせがよく使われます。」
生徒:
「キーが存在しないときにエラーが出るのは怖いですが、get()を使えば安心ですね。」
先生:
「良いところに気づきました。安全な書き方を意識できるようになると、Pythonのコードは一段とレベルアップしますよ。」
生徒:
「これからは、ただ辞書を使うだけじゃなくて、データの構造も考えながら書いてみます!」
先生:
「その姿勢が大切です。ネスト辞書を使いこなせるようになると、Pythonでできることが一気に広がります。」