辞書(dict)とは?
Pythonで言うところの辞書とは、他の言語では「連想配列」などと呼ばれる、似たような要素の集合体でkeyとvalue(値)のワンセットで1要素として扱われます。
JavaScriptを始め、多くの言語でプログラム間のデータのやり取りに使われる、いわゆる、「json形式」のデータ構造を持ちます。
辞書やリスト、タプルなどはまとめて、コンテナオブジェクトとも呼ばれ、まとまったデータを一緒に扱うときに使う基本的な型と言えます。
中でも辞書は順序(序列)を記憶しないのが特徴で要素へのアクセスはkeyを使って行うことができます。
※Pythonには序列を保持するorderedDictという型もあります。
辞書(dict)基本操作
ここではPythonにおける辞書の基本的な操作を紹介します。
辞書を初期化(宣言)する
辞書は基本的に変数に格納して使いますが、使う前に初期化(宣言)する必要があります。
初期化をしないと、関数の呼び出し方などによって、上手く辞書が使えず、エラーが出ることもしばしばありますので、必ず明示的に初期化する癖をつけましょう。
dict1 = {} #一般的な初期化 dict2 = dict() #dict関数での初期化
どちらも基本的に同じ挙動になります。
いきなり要素を明示的に格納することも初期化と呼びます。
keyとvalue(値)は :(コロン)で区切ります。
:(コロン)で区切られた左辺をkey、右辺をvalue(値)と呼びます。
dict3 = {'JP':'Tokyo','US':'Washington'} #要素に文字列を入れて初期化 dict4 = {1:3} #要素に数値を入れて初期化
また、辞書の要素としてリストや辞書、タプルなどのコンテナ型オブジェクトを渡すことも可能です。
dict5 = {1:[]} #辞書の中にリスト dict6 = {2:{}} #辞書の中に辞書 dict7 = {3:()} #辞書の中にタプル
keyだけを辞書に入れる、またはvalueだけを辞書に入れるということはできません。
dict5 = {1} #この場合エラーは出ないがset型と呼ばれる別の型となる dict6 = {'key'} #こちらも同様set型扱い dict7 = {[]} #これはエラーとなり通らない
また、辞書を格納する変数名をわかりやすく「dict」にしたい気持ちはわかりますが絶対にやめましょう。
dict = {} #絶対にこの変数名を使ってはいけません
構文上通るには通りますが、dict()関数があるため思わぬバグを引き起こします。僕はこれが原因で12時間ほどドツボにハマってネットの海を徘徊し続けたことがあります。
もちろん、どこにもこんなバグの解決法など載っていないため、自分で変数名を疑うまで永遠に解決されることはありません。
非常に基本的な事ですが、だからこそ気づきにくく、解決まで時間がかかります。気を付けましょう。
辞書へ要素を追加する
辞書への要素の追加方法です。
初期化のようにいきなり要素を入れるのではなく、元々存在する要素に後からプラスするというイメージです。
[](角括弧)でkeyを指定し要素追加代入
最も基本的な要素の追加方法です。
リストと違い辞書の要素は key と value のワンセットであると説明しました。要素を追加する際は key と value を同時に指定してやる必要があります。
dict8 = {'リンゴ':100,'バナナ':200} dict8['みかん'] = 50 print(dict8) >>>{'リンゴ': 100, 'バナナ': 200, 'みかん': 50}
dictを宣言する時は{}(波括弧)を使いましたが、keyの指定をするときは[](角括弧)を使う必要があることを忘れないでください。
辞書にある要素を更新する
リストでは要素本体は一意ではありませんが、インデックスは一意です。重複しません。
リストとは違い辞書はインデックスを持ちませんが、代わりにkeyが一意となり、重複しないルールになります。
[](角括弧)でkeyを指定し要素を更新
新たなkeyを指定した代入の場合は、要素の追加代入となりますが、すでに存在するkeyを[](角括弧)内に指定した場合、要素のvalue(値)を更新します。
dict8= {'リンゴ': 100, 'バナナ': 200, 'みかん': 50} dict8['リンゴ'] = 500 print(dict8) >>>{'リンゴ': 500, 'バナナ': 200, 'みかん': 50}
すでにdict8に存在するkey ‘リンゴ’ を指定して500という数値を代入しています。
この場合keyは重複しないルールですので、新たに{‘リンゴ’:500}という要素が追加されることはなく、すでに存在する’リンゴ’のvalue(値)のみが書き換えられます。
update()メソッドによる追加更新
辞書には他の辞書オブジェクトの要素で今ある要素を上書きするupdate()というメソッドが存在します。
dict8 = {'リンゴ': 100, 'バナナ': 200, 'みかん': 50} dict9 = {'すいか':1000,'バナナ':10,'メロン':300} dict8.update(dict9) >>>{'リンゴ': 100, 'バナナ': 10, 'みかん': 50, 'すいか': 1000, 'メロン': 300}
update()メソッドを使って、dict8の内容に対してdict9の内容を上書きしています。
この場合は要素の変更が行われるのはdict8の方で、dict9の要素は改変されません。
dict8のkeyに存在しなかった’すいか’と’メロン’は追加代入され、元々dict8にkeyが存在していた’バナナ’はvalue(値)を200から10に上書きされているのがわかります。
辞書から要素を削除する
すでに辞書内にある要素を削除したい場合もいくつかの方法があります。
代表的な削除方法は以下の通り
del文での要素削除
key指定して削除したい場合はdel文を使います。
dict10 = {'リンゴ': 100, 'バナナ': 10, 'みかん': 50, 'すいか': 1000, 'メロン': 300} del dict10['リンゴ'] print(dict10) >>>{'バナナ': 10, 'みかん': 50, 'すいか': 1000, 'メロン': 300}
clear()メソッドで全要素削除
clear()メソッドを使うと全ての要素が削除され、空っぽの辞書が残ります。
dict10.clear() print(dict10) >>>{}
辞書の要素を取り出す(アクセスする)
辞書の要素はそもそもが、keyとvalueという二つの要素によって構成されています。
基本的に辞書は、「○○というkeyに対応するvalueを取り出す」という使い方をしますが、その他にもkeyのみのリストとして取り出したり、valueのみのリストなども作れます。
辞書から特定keyに対応するvalue値を取り出す(アクセスする)
辞書のvalueへのアクセスは基本的にkeyを使います。
一番基本的なvalueへのアクセス方法です。
[](角括弧)でkeyを指定しvalue値を取得
dict10 = {'リンゴ': 100, 'バナナ': 10, 'みかん': 50, 'すいか': 1000, 'メロン': 300} print(dict10['みかん']) >>>50
新規追加、更新を行うときと同じ感じです。
keyまたはvalueのみをリストとして取り出す
keyのリスト、valueのリストをそれぞれ生成するメソッドがあります。
keys()メソッドでkeyのリストを作成
dict10 = {'リンゴ': 100, 'バナナ': 10, 'みかん': 50, 'すいか': 1000, 'メロン': 300} keys_list = dict10.keys() print(keys_list) >>>dict_keys(['リンゴ', 'バナナ', 'みかん', 'すいか', 'メロン'])
リスト型のオブジェクトが返ってきます。
dict_keysオブジェクトをリスト化して扱う
取れたには取れましたが、なんかいつものリストと違いますよね?
試しにインデックスを指定したアクセスをして’リンゴ’という文字列を取出してみましょう。
keys_list[0] >>>TypeError: 'dict_keys' object does not support indexing
エラーが出ます。インデキシングはサポートされていないとのことです。
keys()メソッドで作成されるkeyのリストは、普通のリストではな’dict_keys’型という独自の型ですので、このようなエラーが出ます。
もちろんfor文を使っての繰り返しアクセスや、後に説明しますが、in演算子を使った検索判定などはこのままでも行えます。
それでもindexでの要素アクセスをしたいという場合は、以下のようすれば通常のリストとして使えます。
keys_list = list(keys_list) print(keys_list) >>>['リンゴ', 'バナナ', 'みかん', 'すいか', 'メロン'] print(keys_list[2]) >>>'みかん'
またはリスト内包表記で以下のように。
keys_list = [key for key in keys_list] print(keys_list) >>>['リンゴ', 'バナナ', 'みかん', 'すいか', 'メロン'] print(keys_list[0]) >>>'リンゴ'
values()メソッドでvalue値のリストを作成
keys()メソッドがあるならvalues()メソッドがありそうなことはなんとなく想像がつくと思いますが、もちろん存在します。
dict10 = {'リンゴ': 100, 'バナナ': 10, 'みかん': 50, 'すいか': 1000, 'メロン': 300} values_list = dict10.values() print(values_list) >>>dict_values([100, 10, 50, 1000, 300])
keys()メソッドと同じく、values()メソッドでも返ってくるのはリスト型ですが、通常のリストではなく独自型のオブジェクトです。
dict_valuesオブジェクトをリスト化して扱う
普段のリストとして扱いたい場合は、先ほどのdict_keysオブジェクトをリスト化したのと同じ手順を踏みます。
#list()関数で変換パターン values_list = list(values_list) print(values_list) >>>[100, 10, 50, 1000, 300] print(values_list[2]) >>>50 #またはfor文(リスト内法表記)を使うパターン values_list = [val for val in values_list] print(values_list) >>>[100, 10, 50, 1000, 300] print(keys_list[0]) >>>100
辞書内に特定の要素が含まれるか判定(検索)する
ある値が辞書要素内に含まれるか判定するには、先ほど登場したkeys()メソッド、またはvalues()メソッドを使って、比較演算子のinによって判定を行います。返ってくるのはTrue/Falseの真偽値です。
辞書内のkeyに特定の値があるか判定する
keyに特定の文字列、または数値やその他の値があるかどうかを判定するにはkeys()メソッドで取り出したリストと比較演算子inを使います。
keys()メソッドで取り出したリストでin演算子で比較
dict10 = {'リンゴ': 100, 'バナナ': 10, 'みかん': 50, 'すいか': 1000, 'メロン': 300} 'グレープ' in dict10.keys() >>>False 'すいか' in dict10.keys() >>>True
先ほど行ったような「list化」は必要ありません。あくまでインデックスによる要素への直接アクセスが使えないだけで、イテレータとして使う場合は’dict_keys’オブジェクトのまま可能です。
実は省略できるkeys()
ここまで説明しておいてなんですが、実はkeys()は省略できます。
'グレープ' in dict10 >>>False 'すいか' in dict10 >>>True
inによる検索判定や、for文のイテレータとして辞書をそのまま渡した場合、基本的にkeyの方にアクセスすることになります。
ですので、省略しても得られる結果は同じです。
辞書内のvalue値に特定の値があるか判定する
keys()での比較検索と同じ要領です。
フルーツと価格はそろそろ飽きてきたころだと思うので、国と首都を使ってみましょう。
values()メソッドで取り出したリストでin演算子で比較
dict11 = {'JP':'Tokyo','US':'Washington','UK':'London','RF':'Moscow','KR':'Seoul','CH':'Beijing'} 'Kyoto' in dict11.values() >>>False 'London' in dict11.values() >>>True
Python 辞書(dict)操作 まとめ
リストより内包する要素数が複雑化しやすい辞書ですが、プログラム同士のやり取り(いわゆるAPI)などではjsonが用いられることが多いです。
辞書はjsonとほぼ同じ構造をしており、そのまま辞書をjsonに変換したり、逆にjsonデータを辞書化したりなど、使わずにはいられないほど重要で基礎的な技術になります。
是非とも読み込んでマスターしてください。
こちらもオススメの関連記事
コメント