Developer

【Python独学】辞書の基本的な作成方法
2020.11.02
Lv1

【Python独学】辞書の基本的な作成方法

複数の値を1つにまとめて扱うことが出来るデータ形式の一つに、辞書と呼ばれるものがあります。
今回は、辞書について基本的な作成方法を紹介します。


辞書とは

複数の値を1つにまとめて扱うことに関しては、リストやタプルがありました。
リストやタプルでは、要素の並び順(インデックス番号)で値を管理していました。

辞書では、各要素に『キー(名前に該当するようなもの)』を付け、キーで要素の値を取り出せるように管理されています。
書式としては次のようになります。

・書式
{キー1 : 値1 , キー2 : 値2 , キー3 : 値3, ・・・}

それでは、辞書の例を見てみましょう。

次の例では、
・キーには、”1月”から”6月”
・値には、旧暦月
として辞書を作成します。

{"1月":"睦月","2月":"如月","3月":"弥生","4月":"卯月","5月":"皐月","6月":"水無月"}

これが辞書の形となります。
イメージとしては、キー名に対応した入れ物に値が格納されていくような感じです。
リストやタプルとは異なり、順番(インデックス番号)という考え方がありません。

それでは、辞書の値(旧暦月)を確認してみましょう。
辞書名[“キー名”] の形で指定することで、キーに対応した値を取得できます。

lunar_calender = {"1月":"睦月","2月":"如月","3月":"弥生","4月":"卯月","5月":"皐月","6月":"水無月"}

print(lunar_calender["1月"])    #キー『1月』の値を表示する
print(lunar_calender["2月"])    #キー『2月』の値を表示する
print(lunar_calender["3月"])    #キー『3月』の値を表示する
print(lunar_calender["4月"])    #キー『4月』の値を表示する
print(lunar_calender["5月"])    #キー『5月』の値を表示する
print(lunar_calender["6月"])    #キー『6月』の値を表示する
C:\Python> python 8-1-1.py
睦月
如月
弥生
卯月
皐月
水無月

いかがでしょうか。
辞書はこのように、キーと値のセットで成り立っています。

辞書の意義

では、どんな時に辞書を用いると便利だと思いますか?

上記の旧暦の月の場合だと、正直な話、リストでも良いかもしれません。
なぜかと言いますと・・・
あくまで”月”なので、皆様の頭の中には『1~12』という月の順番が思い浮かぶと思います。
つまり、別に辞書でなくとも、月順に格納された旧暦月のリストがあれば問題はないのです。例えば『6月に該当する旧暦月を取り出したい』という場合には、6番目の要素、即ちリストからインデックス番号5の値を取得すれば良いだろう、ということが直感的に何となくわかりますよね?

なので、自分が取り出したい値が何番目の要素にあるものなのかが明らかに把握出来ている場合には、わざわざキー(名前)を使用するような辞書ではなく、リストやタプルでも別に問題ないです。
ですが逆に、何番目の要素にどの値が入っているかが直感的にはわからないという場合には、辞書は役に立ちます。

次の例では、とある学生の情報を、リストで管理しているとします。

student_info = ["Yuki","Yoshino",3,"B",31,18]

上記のリストを見たとき、どの要素にどのような値が入っているか、想像がつきますか?
・名前は、よしのゆうきさん?それとも、ゆうきよしのさん?
・3とBは、学年とクラスっぽい
・18は年齢っぽいけど、31って何だろう・・・?
等々、ある程度の推測は出来るかもしれませんが、正確にはわからないと思います。

そこで、次のように辞書を使って管理するとどうでしょうか。

student_info = {"first_name":"Yuki",
                "last_name" :"Yoshino",
                "grede"     :3,
                "class"     :"B",
                "Attendance":31,
                "age"       :18
                }

・first_name(苗字)はyoshino
・last_name(名前)はYuki
・grede(学年)は3年
・class(クラス)はB組
・Attendance(出席番号)は31番
・age(年齢)は18歳
というようなイメージになります。

実際にこの辞書の作成者以外の人が見ても、項目と値の対応がわかると思います。
これが辞書の基本的なメリットです。

もう少し補足します。
しばしば、webアプリケーションにデータを問い合わせた際に返ってくる出力の形式に、辞書と同じような形式が使用されていることがあります。
(例えばJSONと呼ばれるデータフォーマットがそのような形式になっています。ちなみに、辞書と同じような役割のものを、他のプログラミング言語では連想配列と呼んでいます)
出力が値だけの羅列だったらやはりどれが何の値なのかよくわからないと思いますが、辞書のように項目名もセットで入っていたらわかりやすいですよね。
これが辞書の強みになります。
値にキーという名前を付けられると、このようなメリットがあります。
辞書を覚えることで上記のようなことが出来るようになりますので、是非とも覚えておきましょう。

辞書のルール

辞書とはどんなものかを簡単に紹介したところで、次に辞書を作成・使用する上での注意点について触れます。

(1)要素の並び順(インデックス番号)を使用して値を取り出すことは出来ない。
上述しましたが、辞書ではリストやタプルとは異なり、要素の順序という考えがありません。
例えば次のように、まるでインデックス番号を指定するかのようにして辞書から値を取り出そうとしても、エラー(KeyError)が発生してしまいます。

lunar_calender = {"1月":"睦月","2月":"如月","3月":"弥生","4月":"卯月","5月":"皐月","6月":"水無月"}

print(lunar_calender[2])    #リストのようにインデックス番号2(3つ目の要素)の値を表示しようとすると、エラー(KeyError)が発生する
C:\Python> python 8-1-2.py
Traceback (most recent call last):

File “C:\Python> python 8-1-2.py”, line 3, in <module>
print(lunar_calender[2])

KeyError: 2

辞書は、順番ではなく、キーと値がセットになっているということを覚えておきましょう。

(2)一つの辞書に同じキー名が存在してはいけない
下記例では、キー名『1月』が複数存在しています。

lunar_calender = {"1月":"睦月","1月":"如月","1月":"弥生","4月":"卯月","5月":"皐月","6月":"水無月"}

同じキーが辞書内に複数ある場合には、キーで値を正確に参照できなくなってしまいます。
一つの辞書内でキー名が被らないようにしましょう。

(3)キーには、イミュータブルな値だけ指定可能
辞書のキーには、文字列・数値といったイミュータブルな値だけが指定出来ます。
イミュータブルなので、タプルも指定できます。

{1,"first"}             #キーが数値
{"二番","second"}       #キーが文字列
{(3,"3rd"),"third"}     #キーがタプル

リストはミュータブルなため、キーには指定できません。
これは、キーに使用している値が途中で変わってしまわないように、という理由からです。
※なお、値には、ミュータブルな値も使用することが出来ます。

以上が、辞書を作成・使用する際の注意点でした。


まとめ

辞書では、各要素に『キー』を付け、キーで要素の値を取り出せます。
要素の並び順(インデックス番号)を使用して値を取り出すことは出来ません。
一つの辞書に同じキー名は付けてはいけません。
キーにはイミュータブルな値だけ指定可能です。


確認問題

(1)辞書の書式について、正しいものを選択しなさい(一つ)。
①(キー1 : 値1 , キー2 : 値2 , キー3 : 値3, ・・・)
②{キー1 : 値1 , キー2 : 値2 , キー3 : 値3, ・・・}
③(値1 : キー1 , 値2 : キー2 , 値3 : キー3, ・・・)
④{値1 : キー1 , 値2 : キー2 , 値3 : キー3, ・・・}

(2)辞書の作成時の注意点について、正しい記述を選びなさい(一つ)。
①要素の並び順(インデックス番号)を使用して値を取り出すことが可能
②一つの辞書に同じキー名が存在してはいけない
③キーには、文字や数値以外にリストも使用できる

答えは次回の記事の最後に!
【Python連載】辞書に要素を追加・削除する

連載目次

独学で学ぶ Pythonプログラミング 連載目次