Pythonのネストされた辞書(入れ子辞書)入門:作成・アクセス・追加・削除・反復処理の基本ガイド
Pythonにおけるネストされた辞書(nested dictionary)とは、別の辞書の中に格納された辞書のことです。既存の辞書の中に、キーと値のマッピング構造を使ってデータを保存できます。
Pythonで辞書を扱っていると、ある辞書の中にさらに別の辞書が含まれている状況に遭遇することがあります。このようなデータ構造は一般に「ネストされた辞書(入れ子辞書)」と呼ばれ、Pythonコードにおいて幅広い用途があります。
このチュートリアルでは、Pythonのネストされた辞書の基礎について解説します。具体的な例を通して、ネストされた辞書の作成方法と変更方法を学びましょう。
おさらい:Pythonの辞書とは
辞書は、Pythonのマッピング型データ構造です。Pythonの辞書はキーを値に対応付け(マップ)し、効率的なデータ保存手段を提供します。
キーが値にマッピングされていれば、そのキーを参照することで値に格納されたデータを取得できます。つまり、ある意味でキーはラベルのような役割を果たします。以下は、地元のアイスクリーム店「The Frozen Spoon」で販売されているフレーバーごとの価格を保存する辞書の例です。
ice_cream_flavors = {
"Vanilla": 0.50,
"Chocolate": 0.50,
"Cookies and Cream": 0.75,
"Strawberry": 0.65,
"Buttered Pecan": 0.90
}
この辞書のキーはアイスクリームの名前(例:「Vanilla」)であり、値は各アイスクリームの1スクープあたりの価格です。
Pythonのネストされた辞書とは
Pythonのネストされた辞書とは、辞書の中にある辞書のことです。ある辞書の中に別の辞書データを表現するために使われます。1つの辞書の中には、必要なだけ何重にも辞書をネストできます。
ネストされた辞書は、複数の個別の辞書を1つの大きな辞書にまとめて管理したい場合に特に便利です。
具体例を見てみましょう。「The Frozen Spoon」で販売されている各フレーバーのアイスクリームに関する情報を、1つの大きな辞書の中に保存したいとします。内側の各辞書には、次の情報を記録します。
- アイスクリームの名前
- 価格
- 在庫のパイント数
このデータを保存するネストされた辞書は、次のようになります。
ice_cream_flavors = {
0: { "flavor": "Vanilla", "price": 0.50, "pints": 20 },
1: { "flavor": "Chocolate", "price": 0.50, "pints": 31 },
2: { "flavor": "Cookies and Cream", "price": 0.75, "pints": 14 }
}
このコードでは、ice_cream_flavorsという1つの大きな辞書を宣言しています。この辞書には3つの辞書が含まれており、それぞれが特定のフレーバーのアイスクリームに関する情報を保存しています。
もしネストされた辞書を使わなければ、これらの辞書をそれぞれ別々の変数に保存する必要があります。しかし、どの辞書もアイスクリームのフレーバーに関する情報を扱っているため、それは直感的とは言えません。関連するデータを1つにまとめられる点が、ネストされた辞書の大きなメリットです。
ネストされた辞書の要素へのアクセス
ネストされた辞書内の要素にアクセスするには、インデックス構文を使用します。
たとえば、辞書内のインデックス値0のアイスクリームの価格を取得したいとします。次のコードで実現できます。
ice_cream_flavors = {
0: { "flavor": "Vanilla", "price": 0.50, "pints": 20 },
1: { "flavor": "Chocolate", "price": 0.50, "pints": 31 },
2: { "flavor": "Cookies and Cream", "price": 0.75, "pints": 14 }
}
print(ice_cream_flavors[0]["price"])
print(ice_cream_flavors[0]["flavor"])
このコードを実行すると、次の出力が得られます。
0.50 Vanilla
このコードでは、まず外側の大きな辞書から取得したい要素のキーを指定します。ここでは、インデックス値0のレコードにアクセスしました。
次に、内側の辞書から取得したい項目の名前を指定します。ここではアイスクリームの価格とフレーバーを取得したかったため、両方のprint()文でpriceとflavorを指定しました。
ネストされた辞書への要素の追加
ネストされた辞書に要素を追加するには、要素を変更するときと同じ構文を使用します。項目を追加するための専用メソッドは用意されておらず、代入演算子を使う必要があります。
項目を追加する構文は次のとおりです。
dictionary_name[new_key_name] = new_value
たとえば、販売中のバニラアイスクリームに関する情報を保存する辞書があるとします。このアイスクリームに割引があるかどうかを追跡したい場合は、次のコードで実現できます。
ice_cream_flavors = {
0: { "flavor": "Vanilla", "price": 0.50, "pints": 20 },
1: { "flavor": "Chocolate", "price": 0.50, "pints": 31 },
2: { "flavor": "Cookies and Cream", "price": 0.75, "pints": 14 }
}
ice_cream_flavors[0]["discount"] = True
print(ice_cream_flavors[0])
コードを実行すると、結果は次のようになります。
{'flavor': 'Vanilla', 'price': 0.5, 'pints': 20, 'discount': True}
辞書はPython変数「ice_cream_flavors」に格納されています。
ここでは、discountというキーを辞書に追加しました。このキーのインデックス位置は0で、値をTrueに設定しています。その後、ice_cream_flavorsというネストされた辞書の中のインデックス値0の辞書を出力することで、discountキーが正しく追加されたことを確認できます。
同じ構文を使えば、既存の辞書の要素を更新することもできます。たとえば、チョコレートアイスクリームの価格を1スクープあたり$0.45に変更したい場合は、次のコードを使用します。
ice_cream_flavors = {
0: { "flavor": "Vanilla", "price": 0.50, "pints": 20 },
1: { "flavor": "Chocolate", "price": 0.50, "pints": 31 },
2: { "flavor": "Cookies and Cream", "price": 0.75, "pints": 14 }
}
ice_cream_flavors[1]["price"] = 0.45
print(ice_cream_flavors[1])
このコードを実行すると、次の出力が得られます。
{'flavor': 'Chocolate', 'price': 0.45, 'pints': 31}
チョコレートアイスクリームのpriceキーの値を$0.45に変更できました。
そのために、priceの値を変更したい辞書のインデックス値として1を指定しました。この値には、辞書内のチョコレートアイスクリームに関する情報が含まれています。そして、priceキーに新しい値を代入することで更新を行いました。
ネストされた辞書からの要素の削除
ネストされた辞書に格納された項目を削除するには、delステートメントを使用します。delステートメントはオブジェクトを削除するためのもので、Pythonのbreakステートメントと同様に独立した行に記述し、その後に削除したい辞書内の項目を続けます。
たとえば、クッキーアンドクリームのアイスクリームを一時的に販売しなくなったとしましょう。保管していた冷凍庫が故障し、商品が溶けてしまったのです。
このアイスクリームをネストされた辞書から削除するには、次のコードを使用します。
ice_cream_flavors = {
0: { "flavor": "Vanilla", "price": 0.50, "pints": 20 },
1: { "flavor": "Chocolate", "price": 0.50, "pints": 31 },
2: { "flavor": "Cookies and Cream", "price": 0.75, "pints": 14 }
}
del ice_cream_flavors[2]
print(ice_cream_flavors)
このコードを実行すると、次の出力が得られます。
{0: {'flavor': 'Vanilla', 'price': 0.5, 'pints': 20}, 1: {'flavor': 'Chocolate', 'price': 0.5, 'pints': 31}}
このコードでは、delステートメントを使って、キーが2であるネストされた辞書内の値を削除しました。ご覧のとおり、Cookies and Creamのエントリがネストされた辞書から取り除かれています。
Pythonのネストされた辞書の反復処理
次に、ネストされた辞書内の各辞書の内容をコンソールに出力したいとします。このタスクはどのように実現すればよいでしょうか。
答えは、Pythonのforループを使った反復処理です。あわせて、Pythonの辞書のitems()メソッドを使うことで、辞書内のキーと値のリストを取得できます。
ice_cream_flavors = {
0: { "flavor": "Vanilla", "price": 0.50, "pints": 20 },
1: { "flavor": "Chocolate", "price": 0.50, "pints": 31 },
2: { "flavor": "Cookies and Cream", "price": 0.75, "pints": 14 }
}
for key, value in ice_cream_flavors.items():
print("Ice Cream:", key)
for k, v in value.items():
print(k + ":", value[k])
このコードを実行すると、次の出力が得られます。
Ice Cream: 0 flavor: Vanilla price: 0.5 pints: 20 Ice Cream: 1 flavor: Chocolate price: 0.5 pints: 31 Ice Cream: 2 flavor: Cookies and Cream price: 0.75 pints: 14
コードを分解して見てみましょう。まず、アイスクリームのフレーバーを格納したネストされた辞書を定義しています。
次に、ice_cream_flavors辞書内の各キーと値を順に処理するforループを定義しています。このループは.items()を使用して、ice_cream_flavors辞書内のすべてのキーと値のリストを生成し、それに対して反復処理を行います。
その後、「Ice Cream:」に続けて、特定のアイスクリームに関連付けられたキーを出力します。
さらに、もう1つのforループを使って、ネストされた辞書内の各value(バニラやチョコレートなど、内側の各エントリ)のすべての項目をループ処理します。このループでは、内側の辞書の各キーの名前、コロン、そしてそのキーに関連付けられた値が順に出力されます。
まとめ
ネストされた辞書を使うと、Pythonで辞書の中に辞書を格納できます。
このチュートリアルでは、具体例を挙げながら次の方法について解説しました。
- ネストされた辞書の作成
- ネストされた辞書への要素の追加と更新
- ネストされた辞書からの要素の削除
- ネストされた辞書の反復処理
Pythonのコーディングについてさらに学びたい方は、ぜひ当サイトの「How to Code in Python」ガイドも参考にしてください。
-
Pythonでswitch文を実現する方法:辞書とget()メソッドを使った実装ガイド
JavaやC#とは異なり、Pythonには組み込みのswitch文が存在しません。そのため、「switch…case」のような条件分岐を実現したい場合は、自分でコードを書いて同等の動作を再現する必要があります。 この記事では、Pythonで「switch…case」に相当する処理を書く方法を解説し、実際に動作するサンプルコードを2つ紹介します。記事を読み終える頃には、あなたのコードにも自信を持って疑似switch文を組み込めるようになっているでしょう。 switch文のおさらい switch文とは、複数のコードブロックの中から1つを選択して実行するための構文です。プログラム内で複数の条件式を評
-
PythonでHello Worldを表示する方法:初心者向けステップバイステップガイド
Pythonの「Hello World」プログラムは、多くのプログラマーが最初に書くプログラムです。print文を使って文字列をコンソールに表示するだけのシンプルなもので、コードは print(Hello World) の1行のみです。 Pythonが正しくインストールされているかを確認するには、まず「Hello World」を書いてみるのがおすすめです。作成方法は主に2つあります。ターミナル(コマンドライン)を使う方法と、Visual Studio CodeやVimなどのコードエディタを使う方法です。 始める前に、お使いのマシンにPython 3がインストールされていることを確認しておき