Pythonで2つの辞書(dictionary)を結合して1つにまとめたい場合、元の辞書を更新する「破壊的」な方法と、新しい辞書を作成する「非破壊的」な方法があります。
それぞれの実装方法と、キーが重複した場合の挙動について解説します。
目次
1. update() メソッド:既存の辞書を更新(破壊的)
dict.update() メソッドを使用すると、呼び出し元の辞書に別の辞書の内容が追加されます。 キーが重複している場合、引数で渡した辞書の値で上書きされます。
実装例:アプリケーション設定の反映
デフォルト設定(default_config)に対して、ユーザー設定(user_preference)を上書きマージするシナリオです。
# アプリケーションのデフォルト設定
default_config = {
"theme": "light",
"notifications": True,
"version": "1.0.0"
}
# ユーザーが変更したい設定項目(重複キーあり)
# theme は "dark" に上書きされ、language が新規追加されます
user_preference = {
"theme": "dark",
"language": "ja"
}
print("--- update実行前 ---")
print(f"Default: {default_config}")
# default_config 自体を書き換えてマージを実行
default_config.update(user_preference)
print("\n--- update実行後 ---")
print(f"Merged : {default_config}")
実行結果
--- update実行前 ---
Default: {'theme': 'light', 'notifications': True, 'version': '1.0.0'}
--- update実行後 ---
Merged : {'theme': 'dark', 'notifications': True, 'version': '1.0.0', 'language': 'ja'}
2. dict() コンストラクタや演算子:新しい辞書を作成(非破壊的)
元の辞書を残したまま、マージされた新しい辞書を作成したい場合は、dict() コンストラクタとアンパック(**)を使用するか、Python 3.9以降であればマージ演算子 | を使用します。
実装例:設定の統合(非破壊的)
default_config = {"theme": "light", "notifications": True}
user_preference = {"theme": "dark", "language": "ja"}
# 方法A: dict() とアンパックを使用(Python 3.5以降)
# 両方の辞書を展開して、新しい辞書を作成します。後勝ち(user_preference優先)です。
merged_config_v1 = dict(**default_config, **user_preference)
# 方法B: マージ演算子 | を使用(Python 3.9以降推奨)
# 直感的で読みやすい記法です。
merged_config_v2 = default_config | user_preference
print("--- 新しい辞書を作成 ---")
print(f"Merged V1: {merged_config_v1}")
print(f"Merged V2: {merged_config_v2}")
# 元の辞書は変更されていません
print("\n--- 元の辞書への影響なし ---")
print(f"Default: {default_config}")
実行結果
--- 新しい辞書を作成 ---
Merged V1: {'theme': 'dark', 'notifications': True, 'language': 'ja'}
Merged V2: {'theme': 'dark', 'notifications': True, 'language': 'ja'}
--- 元の辞書への影響なし ---
Default: {'theme': 'light', 'notifications': True}
まとめ
d1.update(d2):d1自体を変更したい場合に使用します。dict(**d1, **d2)またはd1 | d2: 元の辞書を保持しつつ、新しい辞書を作りたい場合に使用します。
いずれの場合も、重複したキーは「後から追加した辞書(引数側)」の値が優先される点に注意してください。
