ディクショナリー(辞書)とは
ディクショナリー(dictionary)は、Pythonで使える特別なデータの種類(データ型)のひとつです。「dict」と略して呼ぶこともあります。これは、テーブル(表)の構造をしたデータを処理する(読む、書く、編集する)のに使います。例えば、以下のような表を使いたいとしましょう。Zipコードと都市名(タウン名)を対応づける表です。
Zipコード | 都市(タウン)名 |
---|---|
02125 | Boston |
02114 | Cambridge |
これと同じ構造のデータをPythonで表現するには以下のようにします。
zipToCity = { "02125" : "Boston", "02114" : "Cambridge" }
このように、ディクショナリーは「{」と「}」で囲んで定義します。この例のように1行で書いても問題ありませんが、以下のように複数行に渡って書いた方が読みやすいことが多いです。
zipToCity = { "02125" : "Boston",
"02114" : "Cambridge" }
ここでは、”02125”と”Boston”を対応づけ、”02114”と”Cambridge”を対応づけています。対応づける物同士の間に「コロン(:)」を置きます。コロンの左側のデータ(例えば”02125”)のことを「キー(key)」と呼び、コロンの右側のデータ(例えば”Boston”)のことを「値(value)」と呼びます。このように、ディクショナリーはキーと値をペアにして、複数のペアを持つことができます。上記の例のように、ディクショナリーを定義する時には、ペアとペアの間にはカンマ(,)を置きます。
キーから値を検索する
ディクショナリーの最も基本的な使い方は、あるキーからそれに対応する値を得る(検索する)ことです。上記の例を使うと、以下のようにします。
print( zipToCity["02125"] )
zipToCity[“02125”]の部分で、ディクショナリーzipToCityの中からキー”02125”を探し、それに対応する値を返します。つまり”Boston”が返され、それがprint()でシェルに表示されます。もしディクショナリーの中に存在しないキーを使うと、エラーになります。例えば、
print( zipToCity["00000"] )
とすると、「KeyError: “00000”」というエラーメッセージがシェルに表示されます。これは 「”00000”というキーは存在しない」という意味です。
なお、ディクショナリーを使うとき、キーから値を検索することはできますが、その逆はできません。上の例では、”Boston”を使って”02125”を検索することはできません。日常生活で使う辞書の構造を思い出してください。例えば辞書で「programming」の意味(定義)を調べるとします。まずは、辞書の中から「programming」の項目を探しますよね。そしてそこに定義が書いてあります。
キー(調べたい言葉) | 値(調べたい言葉の定義) |
---|---|
programming | the process or activity of writing computer programs. |
この例では、「programming」がキーで、その定義(「the process or activity of writing computer programs」)が値です。このキーと値がペアになって辞書の中に入っています。辞書を使うとき、言葉の定義(値)から言葉そのもの(キー)を検索することはできませんよね?というか、辞書はそういう使い方をする想定では作られていません。Pythonの辞書でも同じことがいえます。
ここまでのことをまとめたプログラムがzipcode.pyです。
ディクショナリーの中の値を変更する
新しいペアを追加する
ペアを削除する
ディクショナリーの中にディクショナリーを入れる
つぎに、ディクショナリーの少し高度な使い方として、ディクショナリーの中にディクショナリーが入っている場合を説明します。以下のコードを読んでください。
zipToStateCity = {
"MA" : {"02125" : "Boston",
"02114" : "Cambridge"},
"CA" : {"92697" : "Irvine",
"92627" : "Costa Mesa"} }
「{」と「}」で囲まれている部分はディクショナリーです。上のコードを単純化すると以下のようになっています。
zipToStateCity = { ... }
つまり、ディクショナリーを作って、それを変数zipToStateCityに入れています。
続いて、このディクショナリーの中身を見ていきます。単純化してみると以下のようになっています。
zipToStateCity = {
"MA" : ... ,
"CA" : ... }
つまり、キーが”MA”で、それに対応する値があります(ここでは値を「…」として単純化しています)。同じように、”CA”というキーがあり、それに対応する値があります。
ここで、”MA”と”CA”に対応する値は、文字や数字ではなくディクショナリーになっています。”MA”に対応する値は以下の通り:
{"02125" : "Boston",
"02114" : "Cambridge"}
「{」と「}」で囲まれたものはディクショナリーなので、これはディクショナリーです。このページの一番最初に使ったディクショナリーと同じものです。
ここでやっているのは、
- MAで使われている郵便番号を都市名と対応づけてディクショナリーとしてまとめる
- CAで使われている郵便番号を都市名と対応づけてディクショナリーとしてまとめる
- MA用のディクショナリーをキー”MA”と対応づけ、CA用のディクショナリーをキー”CA”と対応づける。そして、この2つのペアをディクショナリーとしてまとめる
ということです。外側のディクショナリーと内側のディクショナリーがあることを理解してください。このように、ディクショナリーの中にディクショナリーが入っているような構造のことを「nested structure」といいます。日本語では「ネスト構造」とか「入れ子構造」といいます。また「Dictionaries are nested.」というような言い方をします。日本語では「ディクショナリーがネストしている」とか「ディクショナリーが入れ子構造になっている」というような言い方をします。
さてここから、ネストしているディクショナリーから自分の欲しいデータを取り出す(検索する)方法を説明します。まず、MAで使われている郵便番号全部が欲しい場合は、
zipToStateCity["MA"]
とします。キー”MA”に対応づけられているのはディクショナリーなので、ここではディクショナリーが返ってきます。以下のようにプリントしてみてください。そのディクショナリー全体がShellにプリントされます。
print( zipToStateCity["MA"] )
次に、郵便番号”02125”に対応する都市名が欲しい(知りたい)場合には、以下のようにします。
zipToCityMA = zipToStateCity["MA"]
print( zipToCityMA["02125"] )
1行目で、”MA”に対応するディクショナリーを取り出し、2行目でそのディクショナリーから”02125”に対応する都市名を取り出しています。なお、このコードを短縮して以下のように書くこともできます。
print( zipToStateCity["MA"]["02125"] )
最初のうちは「理解しやすさ」を優先して2行使うのがいいと思います。慣れてきたら、徐々に1行で読み書きできるようになってください。
ここまでのことをまとめたプログラムがzipcode2.pyです。これをカスタマイズして、CAで使われている郵便番号を全部取り出したり、CAの郵便番号から都市名を検索してみてください。