22.辞書型

リストと同じくpythonの中で最も使われるデータの形が
辞書型とよばれるデータ構造です。

辞書型は
キーと値をペアにして
複数の要素を管理することができます。

キーは整数だけではなく、文字で設定可能です。
値は様々な型を用いることができます。

また、リストとは違って、順番は特に関係ありません

辞書型は

{} 波カッコ

で定義できます。

キーと値を要素として格納できます。

{キー:値}

In [1]:
# キーが数値の辞書型の例

d1 = {1:10,2:20}
print(d1)
{1: 10, 2: 20}
In [2]:
# キーが文字列の辞書型の例

d2 = {'a':10,'b':20}
print(d2)
{'b': 20, 'a': 10}

登録した要素の参照するには

変数名[キー]

で値を返すことができます。

ただし、キーが無いとエラーになってしまいます。

In [3]:
# 5つの要素を登録
sample_dic_data = {'apple': 100, 'banana': 100, 'orange': 300, 'mango': 400, 'melon': 500}

# キーがmelonの要素を返す
print(sample_dic_data['melon'])
500
In [4]:
sample_dic_data = {'apple': 100, 'banana': 100, 'orange': 300, 'mango': 400, 'melon': 500}

# キーがgrapeの要素を返す
print(sample_dic_data['grape'])
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-4-ba326f7293a6> in <module>()
      2 
      3 # キーがgrapeの要素を返す
----> 4 print(sample_dic_data['grape'])

KeyError: 'grape'

要素の中にそのキーが無い場合はKeyErrorが発生する。

辞書型の機能としては
要素の追加、変更、削除もリストと同様にできます。

要素の追加

変数名[キー名] = 値

In [5]:
d3 = {1:2 , 3:4}
print(d3)

# 辞書の要素の追加
d3[5] = 8

print(d3)
{1: 2, 3: 4}
{1: 2, 3: 4, 5: 8}

同じキーを指定した場合は値を上書きして変更する。

In [6]:
d4 = {1:2 , 3:4}
print(d4)

# 辞書の要素の変更
d4[1] = 18

print(d4)
{1: 2, 3: 4}
{1: 18, 3: 4}

キーの検索

リストと同じように in を用いて

キー in 辞書名

とすると、キーが存在している場合はTrue
なければFalseが返ります。

In [7]:
d5 = {3:4 , 5:6 , 7:8}

# キー名で検索
print( 7 in d5)
print( 11 in d5)
True
False
In [8]:
mydict = {'pen':1 , 'pineapple':2 , 'apple':3}
print('apple' in mydict)
True

キーを文字列で設定した場合は探す時のキーも文字列で
整数値でキーを設定したら探す時も整数の値で探すことになるので
キーを検索する際のデータの形は注意しましょう。

辞書の削除

全ての要素の削除
辞書変数名.clear()

要素を指定して削除
del 辞書変数名[キー]

もしくは

辞書変数名.pop(キー)

del は値を返さ無いが
popは値を返す。

In [9]:
d6 = {'pen':1 , 'pineapple':2 , 'apple':3}
print(d6)

# キーで削除
del d6['pen']
print(d6)

# 要素の全削除
d6.clear()
print(d6)
{'apple': 3, 'pineapple': 2, 'pen': 1}
{'apple': 3, 'pineapple': 2}
{}
In [10]:
d7 = {'pen':1 , 'pineapple':2 , 'apple':3}
print(d7)

# pop関数でキーで削除
print(d7.pop('pen'))
print(d7)
{'apple': 3, 'pineapple': 2, 'pen': 1}
1
{'apple': 3, 'pineapple': 2}

popは消した値を用いて何かをする場合に使う。

In [11]:
d8 = {'pen':1 , 'pineapple':2 , 'apple':3}
print(d8)

# pop関数で存在しないキーで削除
print(d8.pop('penpen'))
{'apple': 3, 'pineapple': 2, 'pen': 1}
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-11-1964c019c260> in <module>()
      3 
      4 # pop関数で存在しないキーで削除
----> 5 print(d8.pop('penpen'))

KeyError: 'penpen'

値の参照と同じく、存在しないキーを削除するとエラーになる。

キーがない場合でも安全に消したい場合は
popに第二引数を追加します。

辞書変数名.pop(キー名 , 返す値)

In [12]:
d9 = {'pen':1 , 'pineapple':2 , 'apple':3}
print(d9)

# pop関数で存在しないキーで削除
print(d9.pop('penpen' , None))
{'apple': 3, 'pineapple': 2, 'pen': 1}
None

こうするとこのキーで要素があった場合はその値を
要素がなければ、第二引数の値を返すようにできます。

Noneを設定しておくと、何も起きないように見えるので
安全に消すことができます。

後の講義に出てくるIF文や検索の機能を使って
キーが有ったら、という工程を挟むことでも
うまく消すことができます。

この消した値を使って何かする場合は、少しだけ
テクニックが必要になるので注意しましょう。

全ての要素の参照

辞書型の要素は キー と 値 で構成されているので
次の3つの参照方法があります。
・辞書型変数.keys() : キーのリストを返す。
・辞書型変数.values() : 値のリストを返す。
・辞書型変数.items() : キーと値のリストを返す。

In [13]:
# 辞書を定義
mydict = {"pen":1, "pineapple":2, "apple":3}

# キーのリストを返す。
print(mydict.keys())

# 値のリストを返す。
print(mydict.values())

# キーと値のリストを返す。
print(mydict.items())
dict_keys(['apple', 'pineapple', 'pen'])
dict_values([3, 2, 1])
dict_items([('apple', 3), ('pineapple', 2), ('pen', 1)])

キーと値のリストを返す items() では
キーと値をタプル型にまとめたもののリスト
が返ってきています。

返ってきたリスト型の中身がタプル型の値になっているので
そこからキーと値を取り出す、ということをします。

この全てを参照する使い方については
繰り返しの「for文」のところで詳しくやっていきたいと思いますので
まずは 辞書型の取り扱い方を覚えましょう。

辞書はpythonのなかでも最もよく使うデータ型になると思いますので
繰り返し試してみるのが良いと思います。