【Python入門】辞書(dict/連想配列型)の概要と基本操作|初心者向けに徹底解説



辞書(dict)とは?

Pythonで言うところの辞書とは、他の言語では「連想配列」などと呼ばれる、似たような要素の集合体でkeyとvalue(値)のワンセットで1要素として扱われます。

JavaScriptを始め、多くの言語でプログラム間のデータのやり取りに使われる、いわゆる、「json形式」のデータ構造を持ちます。

辞書やリスト、タプルなどはまとめて、コンテナオブジェクトとも呼ばれ、まとまったデータを一緒に扱うときに使う基本的な型と言えます。

中でも辞書は順序(序列)を記憶しないのが特徴で要素へのアクセスはkeyを使って行うことができます。

※Pythonには序列を保持するorderedDictという型もあります。

辞書(dict)基本操作

リスト(list)基本操作

ここではPythonにおける辞書の基本的な操作を紹介します。

辞書を初期化(宣言)する

辞書は基本的に変数に格納して使いますが、使う前に初期化(宣言)する必要があります。

初期化をしないと、関数の呼び出し方などによって、上手く辞書が使えず、エラーが出ることもしばしばありますので、必ず明示的に初期化する癖をつけましょう。

どちらも基本的に同じ挙動になります。

いきなり要素を明示的に格納することも初期化と呼びます。

keyとvalue(値)は :(コロン)で区切ります。

:(コロン)で区切られた左辺をkey、右辺をvalue(値)と呼びます。

また、辞書の要素としてリストや辞書、タプルなどのコンテナ型オブジェクトを渡すことも可能です。

keyだけを辞書に入れる、またはvalueだけを辞書に入れるということはできません。

また、辞書を格納する変数名をわかりやすく「dict」にしたい気持ちはわかりますが絶対にやめましょう

構文上通るには通りますが、dict()関数があるため思わぬバグを引き起こします。僕はこれが原因で12時間ほどドツボにハマってネットの海を徘徊し続けたことがあります。

もちろん、どこにもこんなバグの解決法など載っていないため、自分で変数名を疑うまで永遠に解決されることはありません。

非常に基本的な事ですが、だからこそ気づきにくく、解決まで時間がかかります。気を付けましょう。

辞書へ要素を追加する

辞書への要素の追加方法です。

初期化のようにいきなり要素を入れるのではなく、元々存在する要素に後からプラスするというイメージです。

[](角括弧)でkeyを指定し要素追加代入

最も基本的な要素の追加方法です。

リストと違い辞書の要素は key と value のワンセットであると説明しました。要素を追加する際は key と value を同時に指定してやる必要があります。

dictを宣言する時は{}(波括弧)を使いましたが、keyの指定をするときは[](角括弧)を使う必要があることを忘れないでください。

辞書にある要素を更新する

リストでは要素本体は一意ではありませんが、インデックスは一意です。重複しません。

リストとは違い辞書はインデックスを持ちませんが、代わりにkeyが一意となり、重複しないルールになります。

[](角括弧)でkeyを指定し要素を更新

新たなkeyを指定した代入の場合は、要素の追加代入となりますが、すでに存在するkeyを[](角括弧)内に指定した場合、要素のvalue(値)を更新します。

すでにdict8に存在するkey 'リンゴ' を指定して500という数値を代入しています。

この場合keyは重複しないルールですので、新たに{'リンゴ':500}という要素が追加されることはなく、すでに存在する'リンゴ'のvalue(値)のみが書き換えられます。

update()メソッドによる追加更新

辞書には他の辞書オブジェクトの要素で今ある要素を上書きするupdate()というメソッドが存在します。

update()メソッドを使って、dict8の内容に対してdict9の内容を上書きしています。

この場合は要素の変更が行われるのはdict8の方で、dict9の要素は改変されません。

dict8のkeyに存在しなかった'すいか'と'メロン'は追加代入され、元々dict8にkeyが存在していた'バナナ'はvalue(値)を200から10に上書きされているのがわかります。

辞書から要素を削除する

すでに辞書内にある要素を削除したい場合もいくつかの方法があります。

代表的な削除方法は以下の通り

del文での要素削除

key指定して削除したい場合はdel文を使います。

clear()メソッドで全要素削除

clear()メソッドを使うと全ての要素が削除され、空っぽの辞書が残ります。

辞書の要素を取り出す(アクセスする)

辞書の要素はそもそもが、keyとvalueという二つの要素によって構成されています。

基本的に辞書は、「○○というkeyに対応するvalueを取り出す」という使い方をしますが、その他にもkeyのみのリストとして取り出したり、valueのみのリストなども作れます。

辞書から特定keyに対応するvalue値を取り出す(アクセスする)

辞書のvalueへのアクセスは基本的にkeyを使います。

一番基本的なvalueへのアクセス方法です。

[](角括弧)でkeyを指定しvalue値を取得

新規追加、更新を行うときと同じ感じです。

keyまたはvalueのみをリストとして取り出す

keyのリスト、valueのリストをそれぞれ生成するメソッドがあります。

keys()メソッドでkeyのリストを作成

リスト型のオブジェクトが返ってきます。

dict_keysオブジェクトをリスト化して扱う

取れたには取れましたが、なんかいつものリストと違いますよね?

試しにインデックスを指定したアクセスをして'リンゴ'という文字列を取出してみましょう。

エラーが出ます。インデキシングはサポートされていないとのことです。

keys()メソッドで作成されるkeyのリストは、普通のリストではな'dict_keys'型という独自の型ですので、このようなエラーが出ます。

もちろんfor文を使っての繰り返しアクセスや、後に説明しますが、in演算子を使った検索判定などはこのままでも行えます。

それでもindexでの要素アクセスをしたいという場合は、以下のようすれば通常のリストとして使えます。

またはリスト内包表記で以下のように。

values()メソッドでvalue値のリストを作成

keys()メソッドがあるならvalues()メソッドがありそうなことはなんとなく想像がつくと思いますが、もちろん存在します。

keys()メソッドと同じく、values()メソッドでも返ってくるのはリスト型ですが、通常のリストではなく独自型のオブジェクトです。

dict_valuesオブジェクトをリスト化して扱う

普段のリストとして扱いたい場合は、先ほどのdict_keysオブジェクトをリスト化したのと同じ手順を踏みます。

辞書内に特定の要素が含まれるか判定(検索)する

ある値が辞書要素内に含まれるか判定するには、先ほど登場したkeys()メソッド、またはvalues()メソッドを使って、比較演算子のinによって判定を行います。返ってくるのはTrue/Falseの真偽値です。

辞書内のkeyに特定の値があるか判定する

keyに特定の文字列、または数値やその他の値があるかどうかを判定するにはkeys()メソッドで取り出したリストと比較演算子inを使います。

keys()メソッドで取り出したリストでin演算子で比較

先ほど行ったような「list化」は必要ありません。あくまでインデックスによる要素への直接アクセスが使えないだけで、イテレータとして使う場合は'dict_keys'オブジェクトのまま可能です。

実は省略できるkeys()

ここまで説明しておいてなんですが、実はkeys()は省略できます。

inによる検索判定や、for文のイテレータとして辞書をそのまま渡した場合、基本的にkeyの方にアクセスすることになります。

ですので、省略しても得られる結果は同じです。

辞書内のvalue値に特定の値があるか判定する

keys()での比較検索と同じ要領です。

フルーツと価格はそろそろ飽きてきたころだと思うので、国と首都を使ってみましょう。

values()メソッドで取り出したリストでin演算子で比較

Python 辞書(dict)操作 まとめ

リストより内包する要素数が複雑化しやすい辞書ですが、プログラム同士のやり取り(いわゆるAPI)などではjsonが用いられることが多いです。

辞書はjsonとほぼ同じ構造をしており、そのまま辞書をjsonに変換したり、逆にjsonデータを辞書化したりなど、使わずにはいられないほど重要で基礎的な技術になります。

是非とも読み込んでマスターしてください。

こちらもオススメの関連記事