2つの辞書をマージする方法についてまとめ
アンパック
python 3.5以降
アンパックにより、辞書のすべてのキー、バリューが展開される。
dict1 = {"name": "Grace", "age": 33}
dict2 = {"city": "Kobe", "country": "Japan"}
dict_merge = dict(**dict1, **dict2)
update
updateメソッドは破壊的に更新
元の辞書にキーと値を追加する。
# dict1を更新
dict1.update(dict2)
print(dict1)
キーの競合
キーが競合する場合は、追加した値で更新する。
dict1 = {"name": "Alice"}
dict2 = {"city": "Tokyo"}
dict1.update(dict2)
print(dict1) # {'name': 'Alice', 'city': 'Tokyo'}
元の辞書を変更せずにマージ
copy()
を使用する
dict1 = {"name": "Alice", "age": 25}
dict2 = {"city": "Tokyo", "age": 30}
# dict1を変更せずにマージ
merged_dict = dict1.copy()
merged_dict.update(dict2)
print("dict1:", dict1) # {'name': 'Alice', 'age': 25}
print("merged_dict:", merged_dict) # {'name': 'Alice', 'age': 30, 'city': 'Tokyo'}
|
演算子
|
演算子は新しい辞書を返す。元の辞書は変更しない。
イミュータブルな操作ともいう。
python 3.9以降
dict1 = {"name": "Grace", "age": 33}
dict2 = {"city": "Kobe", "country": "Japan"}
dict_merge = dict1 | dict2
print(dict_merge)
キーの競合
同じキーが両方の辞書に存在する場合、右側の辞書 (dict2) の値が優先されます。
dict1 = {"key": "value1"}
dict2 = {"key": "value2"}
dict_merge = dict1 | dict2
print(dict_merge) # {'key': 'value2'}
まとめ
方法 | サポートバージョン | 特徴 | 破壊的操作 | 重複キー時の挙動 | メモリ効率性 | サンプルコード |
---|---|---|---|---|---|---|
update() |
2.x 以降 | 元の辞書を直接更新する方法。 | はい | 右側の辞書の値で上書きされる | 高い | dict1.update(dict2) |
{**dict1, **dict2} |
3.5 以降 | 新しい辞書を作成するため、元の辞書は変更されない。 | いいえ | 右側の辞書の値で上書きされる | 中程度 | merged_dict = {**dict1, **dict2} |
dict(**dict1, **dict2) |
3.5 以降 |
{**dict1, **dict2} の代替。dict() コンストラクタを使って明示的に辞書を作成する方法。 |
いいえ | 右側の辞書の値で上書きされる | 中程度 | merged_dict = dict(**dict1, **dict2) |
| 演算子 |
3.9 以降 | シンプルで直感的な方法。新しい辞書を作成し、元の辞書は変更されない。 | いいえ | 右側の辞書の値で上書きされる | 高い | |
|= 演算子 |
3.9 以降 | 元の辞書を直接更新する破壊的操作。 | はい | 右側の辞書の値で上書きされる | 高い | |
copy() + update() |
2.x 以降 | 元の辞書を変更せず、新しい辞書を作成する方法。 | いいえ | 右側の辞書の値で上書きされる | 低い | merged_dict = dict1.copy(); merged_dict.update(dict2) |