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で取得したものは、辞書の変更が反映しません。