Python入門 - 辞書(dict); 名前を付けてデータを管理する辞書型について
本ページではPythonの入門コンテンツとして初学者向けにPythonにおける辞書型について説明します。 Pythonの基本データ型の解説としては最後の項目となります。
要約#
辞書 ( dict ) にはリストのように複数のデータを格納することができる
辞書にはどのようなデータ型も詰めることができる
辞書にデータを格納する際には対応するキーを指定する
辞書にはデータ格納時に利用したキーを利用して各データにアクセスする
辞書の要素は自由に追加・削除することができる
辞書型について#
Pythonでは データに名前を付けて格納するためのデータ構造として辞書 (dictionary) が存在します。 他の言語では マップ(map) 、 ハッシュ(hash) 、連想配列 (associative array) などと呼ばれることがある機能です。
本ページではこの「辞書」について具体的に見ていきます。
「辞書」と書いてあると個人的にちょっとわかりづらいので、これ以降は dict という表記をさせていただきます。
dict とは具体的にどのようなものか?#
dict とは簡単に言うと 要素に名前をつけることができるlist です。
具体的に例を示します。
# dictの宣言
scores = {
'阿部': 92,
'加藤': 76,
'佐藤': 83,
'山田': 89,
}
print(f"阿部さんの点数は{scores['阿部']}です")
# => 阿部さんの点数は92です
上記のコードでは、テストの点数を各個人の名前ごとにデータとして socres に格納しています。そして scores につけられた名前を入れることでリストの際に行ったようにデータを取り出すことができます。
list でも同じようにデータを多数集めて保存しておけましたが、要素へのアクセス時にはインデックスという数字しか許可されませんでした。しかし dict では各要素に対して名前を付けることができるのですね。
「辞書」(dictionary) という名称も辞書のように名前からデータを検索することができる、という意味合いでつけられたものです。
dict の作り方#
dict を作成するには 波カッコ {} を利用します。以下の例では単に空の dict を作成しています。
empty_dict = {}
type(empty_dict)
# => <class 'dict'>
上記は単なる空の dict ですが、 dict には複数のデータを入れることができます。
実際にデータを幾つか入れてみます。ここで list と異なる点として、 dict ではデータは必ず キー(key) と value(値) のペアである必要があります。key が名前、 value が対応する値です。 これらの key と value を key: value といった形で {} の中に並べ、各データをカンマ ( , ) で区切っていきます。
scores = {
'阿部': 92, # '阿部' が key で 92 が value
'加藤': 76,
'佐藤': 83,
'山田': 89,
}
print(scores)
# => {'阿部': 92, '加藤': 76, '佐藤': 83, '山田': 89}
リストと同様、どのようなデータも格納することができます。また、 key に関しても特に文字列である必要はありません。
例えば下記のような dict もきちんと dict として働きます。 ただし、製作者自身も混乱してしまうので実際にこのようなぐちゃぐちゃの dict を作ることはそうそうないでしょう。
mixed_dict = {
1: 'こんなデータもOK',
'python': 42,
4.7: 890
}
print(mixed_dict)
# => {1: 'こんなデータもOK', 'python': 42, 4.7: 890}
更に、どのようなデータでも良いので、中に list や dict を入れることも可能です。
complex_dict = {
'田中': {
'身長': 192,
'体重': 84,
'点数': {
'数学': 90,
'英語': 76,
'国語': 88
},
'借りている本': [12, 45] # 借りている本の番号
}
}
print(complex_dict)
# => {'田中': {'身長': 192, '体重': 84, '点数': {'数学': 90, '英語': 76, '国語': 88}, '借りている本': [12, 45]}}
dict のデータを読みだす#
dict に格納されたデータを読み出すには、 key を利用します。 list で実施したように、 dict の後に角カッコ [] をつけてその中に目的のkeyを入れることでアクセスできます。
scores = {
'阿部': 92,
'加藤': 76,
'佐藤': 83,
'山田': 89,
}
scores['阿部']
# => 92
scores['加藤']
# => 76
scores['佐藤']
# => 83
scores['山田']
# => 89
または、 get() を利用してもアクセスが可能です。こちらの場合 () の中にkeyを入れます。
scores.get('阿部')
# => 92
dict の要素を上書きする#
dict の要素の上書きも、リストと同じように実施することができます。 key を指定して値を代入するだけです。
scores = {
'阿部': 92,
'加藤': 76,
'佐藤': 83,
'山田': 89,
}
scores['阿部'] = 100
print(scores['阿部'])
# => 100
また、複数の key に対して同時上書きをする方法もあります。これには update() 関数を利用します。
update() 関数のカッコの中には dict の作成時に利用したものと同じような波カッコ {} による形式のデータを入れます。具体例を見てみます。
scores.update({
'阿部': 99,
'山田': 92,
})
print(scores)
# => {'阿部': 99, '加藤': 76, '佐藤': 83, '山田': 92}
dict の要素を追加する#
dict に対する要素の追加も要素の上書きと同じ方式で行うことができます。
scores = {
'阿部': 92,
'加藤': 76,
'佐藤': 83,
'山田': 89,
}
scores['鈴木'] = 100
print(scores)
# => {'阿部': 92, '加藤': 76, '佐藤': 83, '山田': 89, '鈴木': 100}
また、先ほど紹介した update() 関数の中に渡すデータに新たな key を含めたものを設定することでも新規の要素を追加することができます。
scores = {
'阿部': 92,
'加藤': 76,
'佐藤': 83,
'山田': 89,
}
scores.update({
'鈴木': 100,
'西沢': 92,
})
print(scores)
# => {'阿部': 92, '加藤': 76, '佐藤': 83, '山田': 89, '鈴木': 100, '西沢': 92}
dict の要素を削除する#
dict の要素を削除する方法は3種類あります。
末尾から要素を削除する popitem()#
dict の末尾のデータを削除する方法として popitem() 関数が存在します。 list の時と名称が異なることにご注意ください。この関数はカッコの中に特に何も入れる必要がありません。
この関数はただ単に削除するだけではなく、末尾の要素を返してくれる関数でもあります。削除というよりは、取り出す、といった方がイメージに近いかもしれません。
scores = {
'阿部': 92,
'加藤': 76,
'佐藤': 83,
'山田': 89,
}
# popitem() による末尾削除と値の取得
popped = scores.popitem()
# popitem() により末尾の要素が削除されている
print(scores)
# => {'阿部': 92, '加藤': 76, '佐藤': 83}
# popitem() により末尾の要素が取り出されている
print(popped)
# => ('山田', 89)
補足: タプル (tuple) について#
ここで、 popped に入っているデータの形式は実は本入門コースで初めて見るデータ型で、 タプル (tuple) と呼ばれるデータ型です。
タプルはこのような関数の戻り値として利用されることがあります。 タプルは変更が不可能な list です。基本的な利用方法は list と変わりません。
任意の要素を削除する pop()#
dict の中の任意の要素を削除する方法として pop() 関数があります。この関数は削除する対象の要素のキーを知っている必要があります。
pop() 関数の中に削除対象のキーを入れることでその値を持つ要素が削除されます。
この関数はただ単に削除するだけではなく、削除した要素の値を返してくれる関数でもあります。 popitem() のキー指定バージョンといったところでしょうか。
scores = {
'阿部': 92,
'加藤': 76,
'佐藤': 83,
'山田': 89,
}
# pop() による要素の削除と値の取得
popped = scores.pop('阿部')
# pop() により指定した要素が削除されている
print(scores)
# => {'加藤': 76, '佐藤': 83, '山田': 89}
# pop() により指定した要素の値のみが取り出されている
print(popped)
# => 92
リスト内に存在しない値を指定すると KeyError というエラーが発生します。
すべての要素を削除する clear()#
dict の内容を完全に削除するための関数として clear() があります。カッコの中には何も入れる必要はありません。 list と同じですね。
scores = {
'阿部': 92,
'加藤': 76,
'佐藤': 83,
'山田': 89,
}
popped = scores.clear()
print(scores)
# => {}
まとめ#
本ページでは辞書 (dictionary) のデータ形式とデータを読み書きする方法について解説しました。
dict はもっと多くの機能が提供されるデータ形式ですが、ここでは入門コースで利用する必要最低限の機能のみを紹介しています。
より詳細な機能の全貌を確認したい場合には Python公式の辞書についてのリファレンス をご確認ください。