辞書

2.5. 辞書#

辞書dictionary)は、キーkey)とvalue)の組み合わせでデータを管理するデータ構造です。リストのようにインデックス番号で値を参照するのではなく、「キー」を使って目的の値を取り出す点が特徴です。キーは一意である必要があり、重複することはできません。そのため、データの数が増えても管理がしやすく、コードの可読性や保守性が高まります。なお、「辞書」はカタカナでディクショナリと呼ばれることも多く、特にプログラミングにおいてはそちらの呼び方が一般的です。

辞書では、キーと値のペアをコロン(:)でつなぎ、全体を波かっこ({})で囲んで定義します。どんぐりの価格管理システムを辞書で作ってみましょう。100 円のコナラを登録する場合、キーに'コナラ'、値に 100 を指定して、次のように書きます。

prices = {'コナラ': 100}

複数のどんぐりを登録したいときは、キーと値のペアをカンマ(,)で区切って並べます。

prices = {
    'コナラ': 100,
    'ミズナラ': 110,
    'シラカシ': 80,
    'アラカシ': 90,
    'アベマキ': 320,
    'クヌギ': 300,
    'スタジイ': 80,
    'マテバシイ': 180
}

この辞書を使えば、どんぐりの名前を指定するだけで、その価格を簡単に取り出せます。たとえば、コナラの価格を調べたい場合は次のように書きます。ここで注意したいのは、辞書を作るときには {}を使いましたが、値を取り出すときには [] を使うという点です。括弧の形が違うので混同しないようにしましょう。

prices['コナラ']
100

では、この辞書を利用して、コナラ 1 つ、クヌギ 2 つ、スタジイ 2 つの合計金額を計算してみましょう。

Hide code cell content
total = prices['コナラ'] + prices['クヌギ'] * 2 + prices['スタジイ'] * 2
total
860

このように、辞書を使えば、データの登録順序を覚えていなくても、どんぐりの名前から価格を簡単に取り出せます。リスのレジ打ちも迷わずスピーディー。お釣りをごまかす暇もありません。

辞書に代入できる値は、数値だけではありません。リストなどの複雑なデータも扱うことができます。ここでは、クヌギ、アラカシ、コナラの木の下で収集したどんぐりの重さのデータを、辞書に保存する例を見てみましょう。

どんぐりの木

どんぐりの重さ

クヌギ

5.28, 6.77, 5.42, 6.03, 6.00

アラカシ

1.36, 1.42, 1.54, 1.30, 1.56

コナラ

1.61, 1.53, 1.25, 1.54, 1.20

このデータを辞書に保存するために、まずは木の種類ごとにリストを作り、それぞれを変数に代入します。

kunugi = [5.28, 6.77, 5.42, 6.03, 6.00]
arakashi = [1.36, 1.42, 1.54, 1.30, 1.56]
konara = [1.61, 1.53, 1.25, 1.54, 1.20]

次に、木の名前をキーとして、どんぐりの重さのリストを値とする辞書を作成します。なお、先ほどの例でも見たように、キーには英数字だけでなく日本語を含むさまざまな文字を使うことができます。しかし、英数字以外の文字(日本語など)をキーに使うと、実行環境やコードの書き方によってはバグの原因になることがあります。そのため、この本では、今後はキーに英数字を使うことにします。

では、以下のように辞書を作成してみましょう。

acorn_weights = {
    'kunugi': kunugi,
    'arakashi': arakashi,
    'konara': konara
}

このように作られた辞書は、「辞書の中にリストが入っている」という入れ子構造(ネスト構造)になっています。この構造からどんぐりの重さを 1 つだけ取り出したいときは、まず、木の名前(キー)を使ってリスト全体を取得し、次に、そのリストの中から位置を指定して、特定の要素を取り出します。

たとえば、1 つ目のクヌギどんぐりの重さを取り出す場合は、次のように書きます。

acorn_weights['kunugi'][0]
5.28

ここでは、['kunugi'] で「クヌギのリスト全体」を取得し、そのあと [0] で「最初の要素(1 つ目のどんぐりの重さ)」を取り出しています。

他の例をみてみましょう。4 番目のコナラどんぐりの重さを取得するには、次のように指定します。

acorn_weights['konara'][3]
1.54

なお、リストを個別に定義せず、最初から辞書に直接リストを指定することもできます。

acorn_weights = {
    'kashiwa': [5.28, 6.77, 5.42, 6.03, 6.00],
    'arakashi': [1.36, 1.42, 1.54, 1.30, 1.56],
    'konara': [1.61, 1.53, 1.25, 1.54, 1.20]
}

このように、辞書を使うと、木の種類ごとにどんぐりのデータを整理して効率的に管理することができます。