どうも、きっしゅです!
Pythonを使ってプログラムを書いていると必ず登場すると言っても過言ではない辞書(ディクショナリー)型のデータ。
辞書型は避けては通れないと思いますので、本記事では辞書型に関する使い方を解説も含めて紹介します。
Python初心者必見!辞書型の使い方
そもそも辞書型とは?
使い方を説明する前にまずは、そもそも辞書型がなにかということを説明します。
辞書型とは一意な(重複のない)キーと値を1セットとして、そのセット(要素)を集めたものです。
これだけではわかりにくいかもしれないのでサンプルデータを作成しました。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
}
上記のサンプルデータでいうと、Appleがキーでが¥100が値(バリュー)ですです。このAppleと¥100の組み合わせが1つのセットになります。ですので、上記データの場合はAppleのセット、Orangeのセット、Grapesのセットを集めて1つの辞書型のデータとなっています。
辞書型のキーは一意(ユニーク、重複がない)ものでないといけません。要するに同じ辞書内に全く同じ名前のキーを設定することができないということです。
またキーはイミュータブルであればどんな値であっても設定が可能です。ですが多くの場合は文字列を設定することが多いです。
辞書型は要素の集まりなので配列のように順番がありません。ですので要素を取得する時に配列と同じようにインデックス番号を指定して取得することはできません。
その代わりにキーを指定して要素を取得します。
これで辞書型がどんな値のデータであるかがわかったと思いますので、さっそく使い方に移りたいと思います。
辞書型の使い方(要素の操作)
辞書型の作成する
辞書を作成するときは非常にシンプルです。下記のコードのようにたった1行で作成することができます。
dict_ = {}
非常に簡単ですね!
辞書を作成する時に値を入力したデータを作成する場合は下記のように書きます。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
}
さて、これで辞書型のデータが作成できたと思うので、次はその作成したデータを使っていきたいと思います。
辞書に要素を追加する
もし、先ほど作成した果物が入った辞書型のデータに「Peachを追加したい!」ってなったとします。
そんな時は下記のように書きます。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
}
# Add Peach
dict_['Peach'] = '¥200'
辞書型の変数の後ろに[]を付けて中に設定したいキーを書き、=の先に設定したい値を書きます。
実際にコードを動かしてみると下図のようになります。
Peachが追加されていますね。
続いては要素の変更です。
辞書の要素を変更する
「Peachが豊作で値段が下がった。だから値を変更したい」そんな時には下記のように書きます。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
'Peach': '¥200'
}
# Change Peach value
dict_['Peach'] = '¥150'
書き方としては要素を追加する方法と全く同じです。
実際にコードを書いて動かしてみると下図のようになります。
確かに値が変わっていることがわかると思います。
つまり、辞書に指定したキーの要素がない時は新規追加されて、要素が存在する場合は値が変更されます。
続いては、要素を取得する方法です。
辞書の要素を取得する
せっかく作成したデータが使えなかったら意味がないですよね。
辞書から要素を取得する方法には2つあります。
- キーを指定して取得する方法
- get()関数を使って取得する方法
キーを指定して取得する方法
まずは最も一般的な取得方法である、キーを指定して取得する方法です。
辞書から要素を取得する場合はキーを指定して取得します。
値を取得するときは下記のように書きます。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
'Peach': '¥200'
}
# Get Peach value
value = dict_['Peach'] # value -> ¥200
[]に取得したい要素のキーを書くことで値を取得することができます。
実際にコードを動かしてみると下図のようになります。
値が取得できていますね。
ただしこの取得方法には注意があります。
それは存在しないキーを指定するとエラーが発生するということです。
実際にコードを動かして確認してみると下図のようになります。
KeyErrorが発生していますね。
ですので確実にキーが存在することができる場合のみ、dict_[‘キー’]という書き方をします。
ただしそのキーが確実にあることがわかっている場合って実際は少ないと思います。実装の問題である場合もあれば、送られてきたデータの問題でキーが存在しないことも珍しくはありません。
その度にエラーが発生してシステムが止まってしまうのは、避けたいと思います。
そこで活用するのがget()関数を使った要素の取得です。
get()関数を使って取得する方法
get()関数は現場ではよく使うのでぜひ覚えて欲しい関数です。
get()関数を使って要素を取得する場合は下記のように書きます。
get()関数の中に取得したい値のキーを入力することでエラーが発生することなく値の取得が可能です。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
'Peach': '¥200'
}
# Get non exist key value with get function
value_2 = dict_.get('Strawberry') # value_2 -> None
実際にコードを動かしてみると下図のようになります。
エラーが発生していないことがわかると思います。
get()関数で存在しないキーを指定した時はNoneが返ってきます。
Noneではなくて存在しなかった場合、指定した値を返すことも可能です。
その場合は下記のように書きます。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
'Peach': '¥200'
}
# Get Peach value.
value = dict_.get('Peach', '¥999')
# Return default value.
value_2 = dict_.get('Strawberry', '¥250')
第二引数に値を設定することでキーが存在しなかった場合、第二引数の値が返ってきます。
実際にコードを書いて動かしてみると下図のようになります。
get()関数を活用することで、try-exceptでエラーハンドリングをしたり、キーがない場合にif文などでNoneをチェックして、指定した値を変数に代入するなどのコードを書かずに実装をすることでできます。
それ故に非常にシンプルで可読性の高いコードを書くことができます。
続いては要素の削除です。
辞書の要素を削除する
要素の削除は少し書き方が異なります。
要素の削除をする時は下記のように書きます。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
'Peach': '¥200'
}
# Delete Orange.
del dict_['Orange']
delを先頭に付けて、キーを指定して削除します。
実際にコードを動かすと下図のようになります。
Orangeが辞書から削除されていることがわかると思います。
ここまで理解すれば要素の基本的な操作はマスターできたと思います。
続いては要素の操作ではなく、辞書型のデータそのものの使い方を紹介します。
辞書型の使い方(辞書本体の操作)
update()関数による辞書の結合をする方法
「複数の辞書を結合したい」そんな時もあると思います。
そのような場合はupdate()関数を使います。
update()関数を使う場合は下記のように書きます。
dict_1 = {
'Apple': '¥100',
'Orange': '¥130'
}
dict_2 = {
'Grapes': '¥150',
'Peach': '¥200'
}
# Update dict_1.
dict_1.update(dict_2)
今回はdict_1にdict_2を結合しました。
実際にコードを動かすと下図のようになります。
dict_1 に対して結合をしたためdict_1の中身のみ書き変り dict_2は特に変更が入っていません。
ですので実際に使う場合はどちらの辞書型のデータを書き換えるのかをしっかりと考えた上で使う必要があります。
続いては全ての要素の削除の方法です。
全ての辞書の要素の削除する方法
「要素の全てを削除したい」そんな時は2つの方法があります。
- {}を代入して削除
- clear()関数を使って削除
{}を代入して全ての要素を削除
まずは非常にシンプルな{}を代入する方法です。
下記のように書きます。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
'Peach': '¥200'
}
# Delete all values with {}
dict_ = {} # dict_ -> {}
辞書を作成するときと同じ書き方ですね。
実際にコードを動かすと下図のようになります。
辞書の要素が全て削除されていることがわかると思います。
続いてはclear()関数を使った方法です。
clear()関数を使って全ての要素を削除
clear()関数を使う場合は下記のように書きます。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
'Peach': '¥200'
}
# Delete all values with {}
dict_.clear() # dict_ -> {}
実際にコードを動かすと下図のようになります。
全ての要素が削除されていることがわかります。
{}の代入、clear()関数の使用、どちらを使っても差はないので好きな方を使えばいいと思います。
ただ個人的には{}の代入を使っていると「値がない?実装ミス?」と疑ってしまうので、clear()関数を使って「全部の要素を削除したくてこのコードを書いているんですよ!」ってわかるようにしています。
続いては全てのキーを取得する方法です。
keys()関数による辞書の全てのキーの取得をする方法
辞書の中にどのようなキーがあるのか確認したい時もあると思います。そのような場合はkeys()関数を使います。
keys()を使う場合は下記のように書きます。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
'Peach': '¥200'
}
print(f'Initial data -> {dict_}')
# Get all keys.
keys = dict_.keys() # keys -> dict_keys(['Apple', 'Orange', 'Grapes', 'Peach'])
# Convert to list
key_list = list(keys) # keys_list -> ['Apple', 'Orange', 'Grapes', 'Peach']
1つ注意なのが、keys()関数が返す値がdict_keysオブジェクトであるということです。dict_keysオブジェクトはイテラブルなビューです。リストにするとどうしても大きなメモリを消費してしまうので、大きな辞書のキーを取得する場合には非常に効果的なです。
ですが、本当にリストでキーの全量が欲しい場合もあると思います。そのような場合はlist()関数を使ってリスト型に変換してください。
実際にコードを動かすと下図のようになります。
キーの一覧が取得できていることがわかると思います。
続いては全ての値を取得する方法です。
values()関数による辞書の全ての値の取得をする方法
辞書に入っている全ての値が欲しくなる場合もあると思います。そのような場合はvalues()関数を使います。
values()関数を使う場合は下記のように書きます。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
'Peach': '¥200'
}
# Get all values.
values = dict_.values() # values -> dict_values(['¥100', '¥130', '¥150', '¥200'])
# Convert to list
value_list = list(values) # value_list -> ['¥100', '¥130', '¥150', '¥200']
こちらもkeys()関数と同様にdict_valuesオブジェクトが返ってくるのでリストとして扱いたい場合は、リストに変換する必要があります。
実際にコードを動かすと下図のようになります。
値の一覧が取得できていますね。
続いてはitems()関数によるキーと値をセットで取得する方法です。
items()関数による全てのキーと値のペアの取得をする方法
すべてのキーと値をセットで取得したい、そんな時にはitems()関数を使います。
items()関数を使う場合は下図のように書きます。
dict_ = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
'Peach': '¥200'
}
# Get all items.
items = dict_.items() # items -> dict_items([('Apple', '¥100'), ('Orange', '¥130'), ('Grapes', '¥150'), ('Peach', '¥200')])
# Convert to list
item_list = list(items) # item_list -> [('Apple', '¥100'), ('Orange', '¥130'), ('Grapes', '¥150'), ('Peach', '¥200')]
items()関数を使った場合も、keys()やvalues()と同様にdict_itemsオブジェクトが返ってくるので、リストとして扱いたい場合はリストに変換する必要があります。
またそれぞれのキーと値はタプル型のデータに格納されており、1番目がキー、2番目が値が入っています。
実際にコードを動かすと下図のようになります。
キーと値がセットになった一覧が取得できていると思います。
また各要素がタプル型のデータに格納されていることもわかると思います。
続いてはcopy()関数の使い方です。
copy()関数による辞書のコピーをする方法
辞書を新しい変数に代入して使いたい場合もあると思います。
=を使った代入方式で新しい変数に代入することもできますが、罠があるので注意が必要です。
説明より先に実際にコードを動かして何が起きるのか確認してみましょう。
上図のコードではdict_2に対して要素の削除や値の変更を行っています。
ですが、出力を見てみるとなにもしていないはずのdict_1の値も変わってしまっています。
つまり、代入の場合だと参照している全ての変数に対して影響が及んでしまうのです。
影響が及んでも問題ない場合もあるとは思いますが、多くの場合は不具合の温床となる可能性があります。
ですのでそのようなリスクをなくすために活用するのが、copy()関数です。
copy()関数を使うと新しい辞書を作成するので参照を気にする必要がなくなります。
copy()関数を使う場合は下記のように書きます。
dict_1 = {
'Apple': '¥100',
'Orange': '¥130',
'Grapes': '¥150',
'Peach': '¥200'
}
# Copy dict_1 to dict_2.
dict_2 = dict_1.copy()
実際にコードを動かすと下図のようになります。
copy()関数を使うことでdict_1には全く影響が及んでいないことがわかります。
ですので、他の箇所でも参照されている値を使う場合はただ変数に代入するのではなく、copy()関数を使うことを強く推奨します。
まとめ
いかかでしたか、Pythonの辞書の基本的な使い方を紹介しました。
辞書型のデータの使い方をマスターすると実装できるプログラムの幅が一気に広がると思います。
ここよりさらに辞書を活用したいと考えていらっしゃる方は以下の記事も是非参考にしてください!
実装の幅がさらに広がると思います。
みなさまのPythonライフの役に立ちますと幸いです。
コメント
[…] 【Python初心者必見!】辞書型の使い方Pythonの辞書は使いこなせていますか?本記事ではPythonエンジニアとして避けては通れない辞書の使い方を紹介しています。この記事を読めば辞書の […]
[…] 【Python初心者必見!】辞書型の使い方Pythonの辞書は使いこなせていますか?本記事ではPythonエンジニアとして避けては通れない辞書の使い方を紹介しています。この記事を読めば辞書の […]
[…] 【Python初心者必見!】辞書型の使い方Pythonの辞書は使いこなせていますか?本記事ではPythonエンジニアとして避けては通れない辞書の使い方を紹介しています。この記事を読めば辞書の […]