[Python] 辞書型dictの初期化方法一覧(波括弧{}、コンストラクタ、内包表記)

2021年9月5日日曜日

Python

Pythonのdictの初期化方法を一挙に解説
浅いコピーによるオブジェクトの共有の注意点や、辞書内包表記と条件分岐を組み合わせた初期化方法も解説しています。


dictの初期化一覧

波括弧{}で初期化

キーと値を指定して初期化

dict_a = {'key_1':1, 'key_2':'str_value'}

print(dict_a)
# {'key_1': 1, 'key_2': 'str_value'}
print(dict_a['key_2'])
# str_value

空で初期化

dict_b = {}
print(dict_b)
# {}
# キーと値を挿入
dict_b['key_1'] = 1
dict_b[2] = 'str_value'
print(dict_b)
# {'key_1': 1, 2: 'str_value'}

複数のdictで初期化。
オブジェクトが一部共有化されます。意図しない値変更に注意してください。

dict_a = {'key_1':1, 'key_2':2}
dict_b = {'key_3':3, 'key_4':{'key_5':5}}
dict_c = {**dict_a, **dict_b}
print(dict_c)
# {'key_1': 1, 'key_2': 2, 'key_3': 3, 'key_4': {'key_5': 5}}

# 値を変更
dict_a['key_1'] = 10 # dict_cの値は変更されない
dict_b['key_4']['key_5'] = 50 # dict_cの値も変更される
print(dict_c)
# {'key_1': 1, 'key_2': 2, 'key_3': 3, 'key_4': {'key_5': 50}} 

コンストラクタで初期化

キーワードを引数として初期化
keyにint型を指定することはできません

dict_a = dict(key_1=1, key_2='str_value')
print(dict_a)
# {'key_1': 1, 'key_2': 'str_value'}

空で初期化

dict_a = dict()
print(dict_a)
# {}

タプルで初期化

taple_a = ('key_1', 1)
taple_b = (2, 'str_value')
dict_a = dict([ taple_a, taple_b ])
print(dict_a)
# {'key_1': 1, 2: 'str_value'}

リストで初期化

key_list = ['key_1', 'key_2', 3]
value_list = [1, 2, 'str_value']
dict_a = dict( zip(key_list, value_list) )
print(dict_a)
# {'key_1': 1, 'key_2': 2, 3: 'str_value'}

異なるdictで初期化
オブジェクトが一部共有化されます。意図しない値変更に注意してください。

dict_a = {'key_1':1, 'key_2':{'key_3':3}}
dict_b = dict( dict_a )
print(dict_b)
# {'key_1': 1, 'key_2': {'key_3': 3}}

dict_a['key_1'] = 10 # dict_cの値は変更されない
dict_a['key_2']['key_3'] = 30 # dict_cの値は変更される
print(dict_b)
# {'key_1': 1, 'key_2': {'key_3': 30}}

複数のdictで初期化
オブジェクトが一部共有化されます。意図しない値変更に注意してください。

dict_a = {'key_1':1, 'key_2':{'key_3':3}}
dict_b = {'key_4':4}
# **がないと下記エラーが発生
# SyntaxError: positional argument follows keyword argument unpacking
dict_c = dict(**dict_a, **dict_b)
print(dict_c)
# {'key_1': 1, 'key_2': {'key_3': 3}, 'key_4': 4}

dict_a['key_2']['key_3'] = 30 # dict_cの値が更新される
dict_b['key_4'] = 40 # dict_cの値が更新されない
print(dict_c)
# {'key_1': 1, 'key_2': {'key_3': 30}, 'key_4': 4}

内包表記で初期化

辞書内包表記を使ってリストで初期化
{ KEY: VALUE for 変数名 in イテラブルオブジェクト }

list_a = ['key_1', 'key_2', 'key_3']
dict_a = { key: i for i, key in enumerate( list_a )}

print(dict_a)
# {'key_1': 0, 'key_2': 1, 'key_3': 2}

辞書内包表記を使ってzipで初期化
{ KEY: VALUE for 変数名 in イテラブルオブジェクト }

list_a = ['key_1', 'key_2', 3]
list_b = [1, 2, 'str_value']
dict_c = { key: value for key, value in zip(list_a, list_b) } 

print(dict_c)
# {'key_1': 1, 'key_2': 2, 3: 'str_value'}

辞書内包表記を使って条件分岐を行い初期化
{ KEY: VALUE for 変数名 in イテラブルオブジェクト if 条件 }

list_a = ['key_1', 'key_2', 3]
list_b = [1, 2, 'str_value']
# keyがstring型の場合のみdictに追加
dict_c = { key: value for key, value in zip(list_a, list_b) if type(key) == str} 

print(dict_c)
# {'key_1': 1, 'key_2': 2}

さいごに

辞書型dictの様々な初期化方法を解説しました。
単に初期化するだけであれば波括弧やコンストラクタで十分ですが、
条件分岐などをさせたい場合は内包表記がおすすめです。

初期化の際にはオブジェクトがコピーされている範囲を注意してください。
値の変更によって意図せずdictの値が変更されていると不具合の原因になります。

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology