Pythonの辞書(連想配列)について

辞書の作成

空の辞書の作成は"{}"になります。

変数 = {}
変数aを空の辞書とする例は以下のようになります。
a = {}
print(a)    #=> {}

初期要素がある辞書は、初期要素をカンマ区切りで"{" と"}"で囲んで作成します。

変数 = {"キー1": "値1", "キー2": 値2}

例 キーが"name"、値が"yamada"、キーが"age"、値が20の辞書は以下のようになります。

a = {"name": "yamada", "age": 20}

dict

組み込みクラスdictを使って辞書を作成することができます。

キーと値の指定方法は、複数あります。

dict(キー1=値1, キー2=値2, ...)

または
dict([("キー1", 値1), ("キー2", 値2), ...])

または
dict({"キー1": 値1, "キー2": 値2, ...})

例 キーが"name"、値が"yamada"、とキーが"age"、値が20の辞書は以下で作成できます。

b = dict(name="yamada", age=20)
print(b)   #=> {'name': 'yamada', 'age': 20}

c = dict([("name", "yamada"), ("age", 20)])
print(c)   #=> {'name': 'yamada', 'age': 20}

d = dict({"name", "yamada", "age": 20})
print(d)   #=> {'name': 'yamada', 'age': 20}

値の取得

あるキーの値を取得する場合、以下の2つの指定方法があります。

辞書.get('キー') または  辞書['キー'] 

辞書.get('キー')の場合、キーが存在しないと Noneになります。

a = {'name': 'yamada', 'age': 20, 'weight': 60}
h = a.get('height')
print(h)  #=> None

辞書['キー']の場合、キーが存在しないとエラーになります。

a = {'name': 'yamada', 'age': 20, 'weight': 60}
h = a['height']
上記を実行すると、以下のようなエラーになります。
Traceback (most recent call last):
  File "dict_test.py", line 2, in <module>
    h = a['height']
KeyError: 'height'

サイズ取得(組み込み関数len)

辞書のサイズ(要素数)を取得する場合、組み込み関数のlenを使います。

len(辞書)

a = {'name': 'yamada', 'age': 20, 'weight': 60}
size = len(a)
print(size)  #=> 3

存在確認

キーの存在を確認

あるキーが存在するかどうかの確認は、in を使います。

'キー' in 辞書

例 以下を実行すると、キー 'age' は存在するので '有り' と表示

a = {'name': 'yamada', 'age': 20, 'weight': 60}
if 'age' in a:
    print('有り')
else:
    print('無し')

キーが存在しないことを確認

あるキーが存在するかどうかの確認は、not in を使います。

'キー' not in 辞書

例 以下を実行すると、キー'height'は存在しないので '無し' と表示

a = {'name': 'yamada', 'age': 20, 'weight': 60}
if 'height' not in a:
    print('無し')
else:
    print('有り')

値の存在を確認

ある値が存在するかどうかの確認は、valuesで全ての値を取得して、それに in を使用します。

値 in 辞書.values()

例 値 'yamada'は存在するので、以下を実行すると '有り' と表示

a = {'name': 'yamada', 'age': 20, 'weight': 60}
if 'yamada' in a.values():
    print('有り')
else:
    print('無し')

値が存在しないことを確認

ある値が存在しないことを確認する場合、valuesで全ての値を取得して、それに not in を使用します。

値 not in 辞書.values()

例 値 'honda'は存在しないので、以下を実行すると '無し' と表示

a = {'name': 'yamada', 'age': 20, 'weight': 60}
if 'honda' not in a.values():
    print('無し')
else:
    print('有り')

追加

新しいキーと値を追加する場合、以下のようにします。

辞書['キー'] = 値
もし同じキーがすでに存在する場合は、上書きになります。
a = {'name': 'yamada', 'age': 20}
a['weight'] = 60
print(a)       #=> {'name': 'yamada', 'age': 20, 'weight': 60}

削除

辞書の要素の削除方法

要素の削除(del)

要素の削除はdel関数を使います。

del(辞書['キー'])

a = {'name': 'yamada', 'age': 20, 'weight': 60}
del(a['age'])
print(a)      #=> {'name': 'yamada', 'weight': 60}

指定キーの削除と値の取得(pop)

指定キーを削除して、その値を取得する場合、popメソッドを使います。

変数 = 辞書.pop('キー')

a = {'name': 'yamada', 'age': 20, 'weight': 60}
b = a.pop('name')
print(a)    #=>  {'age': 20, 'weight': 60}
print(b)    #=>  'yamada' 

全ての要素を削除(clear)

全ての要素を削除する場合、clearメソッドを使います。

辞書.clear()

a = {'name': 'yamada', 'age': 20}
a.clear()
print(a)     #=> {}

マージ(連結)

2つの辞書のマージ方法について

辞書をマージして更新する(update)

ある辞書に他の辞書をマージして、キーや値を更新する場合、updateメソッドを使います。 同じキーがある場合、updateメソッドを実行する辞書が上書きされます。 以下の場合、辞書1と辞書2に同じキーがあれば、辞書2の値で上書きされます。

辞書1.update(辞書2)

例 辞書aに辞書bをマージ

a = {'name': 'suzuki', 'age': 20}
b = {'name': 'honda', 'weight': 60}

a.update(b)
print(a)    #=> {'name': 'honda', 'age': 20, 'weight': 60}
print(b)    #=> {'name': 'honda', 'weight': 60}
updateメソッドを実行する辞書aのキー'name'の値"suzuki"は、辞書bの値"honda"で上書きされていて、 辞書aに存在しないキー"weight"は追加されています。 辞書bは何も変化していません。。

キーや値だけを取得

辞書の全てのキーだけや、全ての値を取得する方法

全てのキーを取得

全てのキーを取得する場合、listまたは、keysメソッドを使います。

変数 = list(辞書)   または   変数 = 辞書.keys()
2つの戻り値の型は異なり、listはリスト(配列)を返し、keysメソッドは辞書ビューオブジェクトを返します。 取得元辞書を修正する場合、辞書ビューオブジェクトは注意が必要なため、特別な場合以外は list を使用しています。

a = {'name': 'yamada', 'age': 20, 'weight': 60}
i = list(a)
print(i)  #=> ['name', 'age', 'weight']

k = a.keys()
print(k)   #=> dict_keys(['name', 'age', 'weight'])

全ての値を取得

全ての値の所得は、valuesメソッドを使います。 戻り値は、辞書ビューオブジェクトを返します。 取得後に取得元辞書を修正する場合は、注意が必要です。

辞書.values()
辞書ビューオブジェクトでなく、リスト(配列)を取得したい場合は、listを使って以下のようにする方法があります。
list(辞書.values())

a = {'name': 'yamada', 'age': 20, 'weight': 60}

v = a.values()
print(v)   #=> dict_values(['yamada', 20, 60]) 

i = list(a.values())
print(i)   #=> ['yamada', 20, 60]

辞書ビューオブジェクト

上記より抜粋
dict.keys(), dict.values(), dict.items() によって返されるオブジェクトは、
ビューオブジェクト です。これらは、辞書の項目の動的なビューを提供し、辞書が
変更された時、ビューはその変更を反映します。

そのため、取得元の辞書が変更されると、ビューオブジェクトは変更の影響を受けます。

a = {'name': 'yamada', 'age': 20, 'weight': 60}
k = a.keys()
i = list(a)

del(a['name'])

print(k)    #=> dict_keys(['age', 'weight'])    'name'削除前に取得したのに、反映されている。

print(i)    #=> ['name', 'age', 'weight']
上記では、辞書aから"name"キーを削除すると、削除前にkeysメソッドで取得したものにも反映しています。 listで取得したものは、辞書の変更が反映しません。