辞書の作成方法
次のサンプルコードは、全て次の構造を持つ辞書を作成します。 順序は利用頻度の高い順となっており、後になるほど理解しづらくなりますが、使用する機会も少なくなります。キー | 値 | |
---|---|---|
ペア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'}
参考資料
検証環境
- Python 3.11.3 (tags/v3.11.3:f3909b8, Apr 4 2023, 23:49:59) [MSC v.1934 64 bit (AMD64)] on win32
- Microsoft Windows 10 Enterprise Version 22H2 OS Build 19045.3693 Experience: Windows Feature Experience Pack 1000.19053.1000.0