Python - 辞書(dict)の作成

新しい辞書(ディクショナリ―・マッピング型)を初期化するには、波括弧 {} や 型コンストラクタ dict() を使用します。

辞書の作成方法

次のサンプルコードは、全て次の構造を持つ辞書を作成します。 順序は利用頻度の高い順となっており、後になるほど理解しづらくなりますが、使用する機会も少なくなります。
キー
ペア1 'key1' 'value1'
ペア2 'key2 'value2'
# 波括弧 { } を使用して初期値を指定し、辞書を作成
newDict = {'key1': 'value1', 'key2': 'value2'}
# 波括弧 { } で 空の辞書を作成
newDict = {}

# 辞書に キーと値 の ペアを登録
newDict['key1'] = 'value1'
newDict['key2'] = 'value2'
# 型コンストラクタ dict() で 空の辞書を作成
newDict = dict()

# 辞書に キーと値 の ペアを登録
newDict['key1'] = 'value1'
newDict['key2'] = 'value2'
# 辞書から辞書を作成(コピー)
orgDict = dict({'key1': 'value1', 'key2': 'value2'})
newDict = dict(orgDict)
# dict() + 二次元配列(キー&値を含むリスト の リスト)
newDict = dict([['key1', 'value1'], ['key2', 'value2']])
# dict() + タプルのリスト(キー&値を含むタプル の リスト)
newDict = dict([('key1', 'value1'), ('key2', 'value2')])
# zip関数 で 2つのリスト を合成
keyList = ['key1', 'key2']
valueList = ['value1', 'value2']
newDict = dict(zip(keyList, valueList))
# dict() + キーワード引数
newDict = dict(key1='value1', key2='value2')
# dict() + 複数の辞書からアンパック
dict1 = {'key1': 'value1'}
dict2 = {'key2': 'value2'}

newDict = dict(**dict1, **dict2)
# 波括弧 { } + アンパックを使用し、複数の辞書から作成
dict1 = {'key1': 'value1'}
dict2 = {'key2': 'value2'}

newDict = {**dict1, **dict2}    

解説

波カッコ { } で 初期値を設定

波カッコ 内に、キーと値のペアを、カンマ区切りで渡します。キーと値のペア の間は コロン : で 区切ります。
newDict = {'key1': 'value1', 'key2': 'value2'}

リテラルの代わりに、変数も使用できます。

k1 = 'key1'
k2 = 'key2'
v1 = 'value1'
v2 = 'value2'

# 波カッコ + { } 変数
newDict = {k1: v1, k2: v2}

同じキーが複数登場するときは、最後の値で初期化されます。

newDict = {'key1': '', 'key1': 'value1'}
# 結果 = {'key1': 'value1'}

空の辞書を作成し、値を追加

空の辞書を作成するには、波カッコ { } または 型コンストラクタ dict() を使用します。 値を追加するには、辞書オブジェクトに対して 角カッコ [] 内で キー値を指定し、値を代入します。

次のサンプルコードは 波括弧 { } を使用し、空の辞書を作成します。その後、添え字を使用してキーと値のペアを登録します。

# 波括弧 { } で 空の辞書を作成
newDict = {}

# 辞書に キーと値 の ペアを登録
newDict['key1'] = 'value1'
newDict['key2'] = 'value2'

次のサンプルコードは 空の辞書の作成に 型コンストラクタ dict() を使用します。

# 型コンストラクタ dict() で 空の辞書を作成
newDict = dict()

# 辞書に キーと値 の ペアを登録
newDict['key1'] = 'value1'
newDict['key2'] = 'value2'

辞書から辞書を作成(コピー)

型コンストラクタ dict() に 辞書オブジェクト を 渡すと、同じ構造の辞書が 新しく作成されます。
# 辞書から辞書を作成(コピー)
orgDict = dict({'key1': 'value1', 'key2': 'value2'})
newDict = dict(orgDict)

作成された辞書に対して キーの追加 や 削除 を行っても、元の辞書には影響しません。

# 辞書を作成し、コピー
orgDict = dict({'key': 'value'})
newDict = dict(orgDict)

# どちらも結果は同じ
print(orgDict['key'])  # 'value'
print(newDict['key'])  # 'value'

# newDict の値を変更
newDict['key'] = 'del'

# newDict のみ、変更される
print(orgDict['key'])  # 'value'
print(newDict['key'])  # 'del'

ただし、キーと値に渡したオブジェクトは 浅いコピー のため、オブジェクトに対して操作を行った場合、元の辞書にも影響します。

# 値にリストを含む辞書を作成し、コピー
orgDict = dict({'key': ['value']})
newDict = dict(orgDict)

# どちらも結果は同じ
print(orgDict['key']) # ['test']
print(newDict['key']) # ['test']

# リストに値を追加
newDict['key'].append('value')

# どちらも結果は同じ
print(orgDict['key'])  # ['value', 'value']
print(newDict['key'])  # ['value', 'value']

dict() + 二次元リスト(キー&値を含むリスト の リスト)

型コンストラクタ dict() の引数に、二次元のリストを渡します。
newDict = dict([[<キー>, <値>], [<キー>, <値>]])
newDict = dict([['key1', 'value1'], ['key2', 'value2']])

同じキーがある場合、最後の値で初期化されます。

newDict = dict([['key1', ''], ['key1', 'value1']])
# 結果 = {'key1': 'value1'}

要素数が 2つ 以外のリストを渡すと ValueError エラーが発生します。

newDict = dict([['key1', '', 'value1']])
# ValueError: dictionary update sequence element #0 has length 3; 2 is required

dict() + タプルのリスト(キー&値を含むタプル の リスト)

型コンストラクタ dict() の引数に、タプルのリストを渡します。
newDict = dict([(<キー>, <値>), (<キー>, <値>)])
newDict = dict([('key1', 'value1'), ('key2', 'value2')])

同じキーがある場合、最後の値で初期化されます。

newDict = dict([('key1', ''), ('key1', 'value1')])
# 結果 = {'key1': 'value1'}

要素数が 2つ 以外のタプルを渡すと ValueError エラーが発生します。

newDict = dict([('key1', '', 'value1')])
# ValueError: dictionary update sequence element #0 has length 3; 2 is required

zip関数 で 2つのリスト を合成

zip関数に 2つのリストを渡すと、リストが合成された結果が得られます。合成された結果は 前章「dict() + タプルのリスト」と同じになります。
keyList = ['key1', 'key2']
valueList = ['value1', 'value2']

keyValue = zip(keyList, valueList)
# [('key1', 'value1'), ('key2', 'value2')]

dict() + キーワード引数

キーワード引数の名前 が キー値 になります。先頭が数値の名前など、キーワード引数名に使用できない値は キーにできません。そのため、利用頻度は低いです。
newDict = dict(<キー>=<値>, <キー>=<値>)
newDict = dict(key1='value1', key2='value2')

次のサンプルコードはキーワード引数として使用できない名前('1key' と 'key@')を使用しているため、SyntaxError が発生します。

# SyntaxError: invalid decimal literal
newDict = dict(1key='value1')

# SyntaxError: invalid syntax
newDict = dict(key@='value1')

dict() + 複数の辞書からアンパック

関数の引数に ** を付与した辞書を渡すと、キーワード引数として展開されます。
# 次のようにアンパックを使用すると
dict1 = {'key1': 'value1'}
newDict = dict(**dict1)

# 次のようにキーワード引数として展開される
newDict = dict(key1='value1')
# 次のようにアンパックを使用すると
dict1 = {'key1': 'value1', 'key2': 'value2'}
newDict = dict(**dict1)

# 次のようにキーワード引数として展開される
newDict = dict(key1='value1', key2='value2')
# 次のようにアンパックを使用すると
dict1 = {'key1': 'value1'}
dict2 = {'key2': 'value2'}
newDict = dict(**dict1, **dict2)

# 次のようにキーワード引数として展開される
newDict = dict(key1='value1', key2='value2')
# 次のようにアンパックを使用すると
dict1 = {'key1': 'value1'}
dict2 = {'key2': 'value2'}
dict3 = {'key3': 'value3'}
newDict = dict(**dict1, **dict2, **dict3)

# 次のようにキーワード引数として展開される
newDict = dict(key1='value1', key2='value2', key3='value3')

キーワード引数として使用できない名前を使用すると SyntaxError が発生しますが、アンパックを使用するとエラーになりません。

newDict = dict(1key='value1')
# SyntaxError: invalid decimal literal
dict1 = {'1key': 'value1'}
newDict = dict(**dict1)
# {'1key': 'value1'}

波括弧 { } + アンパックを使用し、複数の辞書から作成

アンパック ** は 波カッコ { } 内でも使用できます。
# 次のようにアンパックを使用すると
dict1 = {'key1': 'value1'}
newDict = {**dict1}

# 次のように展開される
newDict = {'key1': 'value1'}
# 次のようにアンパックを使用すると
dict1 = {'key1': 'value1'}
newDict = {**dict1, 'key2': 'value2'}    

# 次のように展開される
newDict = {'key1': 'value1', 'key2': 'value2'}
# 次のようにアンパックを使用すると
dict1 = {'key1': 'value1', 'key2': 'value2'}
newDict = {**dict1, 'key3': 'value3'}

# 次のように展開される
newDict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
# 次のようにアンパックを使用すると
dict1 = {'key1': 'value1'}
dict2 = {'key2': 'value2'}
newDict = {**dict1, **dict2}

# 次のように展開される
newDict = {'key1': 'value1', 'key2': 'value2'}

参考資料

検証環境