1. はじめに
Pythonの辞書(dict)は、データをキーと値のペアで管理するための便利なデータ構造です。辞書を結合する必要が生じる場面は多く、たとえば複数の設定ファイルを統合したり、異なるデータセットをまとめたりする際に活用されます。
この記事では、Pythonで辞書を結合するさまざまな方法について詳しく解説します。初心者から中級者まで対応した内容で、基本的な手法から最新のPython 3.9で導入された方法、さらには特殊な状況で役立つアプローチまでを網羅します。コード例を交えながら、それぞれの手法の特徴や適切な使い分けを学んでいきましょう。
2. 辞書結合の基本方法
Pythonには辞書を結合するためのさまざまな方法が用意されています。まずは基本的な方法から解説していきます。
2.1 update()
メソッドを使用
特徴
update()
メソッドは、ある辞書に別の辞書を結合するための最も基本的な方法です。この操作は破壊的(元の辞書が変更される)であるため、元の辞書の内容を保持する必要がある場合には注意が必要です。
コード例
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
dict1.update(dict2)
print(dict1) # {'a': 1, 'b': 3, 'c': 4}
解説
上記のコードでは、dict1
にdict2
が結合されています。キーが重複している場合、後から結合される辞書(この場合はdict2
)の値で上書きされます。
使用場面
- 元の辞書をそのまま変更して問題がない場合。
- シンプルで効率的な方法が必要な場合。

2.2 アンパック演算子(**
)を使用
特徴
Python 3.5以降では、アンパック演算子(**
)を使用して辞書を結合することができます。この方法は非破壊的(元の辞書を変更しない)で、新しい辞書を作成します。
コード例
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
combined_dict = {**dict1, **dict2}
print(combined_dict) # {'a': 1, 'b': 3, 'c': 4}
解説
この方法では、複数の辞書を展開し、新しい辞書を作成しています。キーが重複している場合、後に指定された辞書(dict2
)の値が優先されます。
使用場面
- 元の辞書を変更せず、新しい辞書が必要な場合。
- 可読性が求められる場面。
2.3 マージ演算子(|
)を使用
特徴
Python 3.9以降では、|
演算子が導入され、簡潔に辞書を結合できるようになりました。この方法も非破壊的で、新しい辞書を作成します。
コード例
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
combined_dict = dict1 | dict2
print(combined_dict) # {'a': 1, 'b': 3, 'c': 4}
解説
この方法では、直感的な書き方で辞書を結合できます。コードの可読性が向上し、Python初心者にもわかりやすい表現です。
使用場面
- Python 3.9以降を使用している場合。
- シンプルで分かりやすい記述が必要な場合。
3. 特殊なケースの辞書結合
基本的な辞書結合方法を理解したところで、ここでは特殊なケースや応用的な手法について解説します。特定の状況で役立つ方法や、少し高度な操作を必要とするシナリオをカバーします。
3.1 dict()
コンストラクタを使用
特徴
dict()
コンストラクタを利用して複数の辞書を結合する方法です。この方法は、辞書に追加の値を直接指定する場合や、展開された辞書を含めて新しい辞書を作成する際に便利です。
コード例
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3}
combined_dict = dict(dict1, **dict2)
print(combined_dict) # {'a': 1, 'b': 2, 'c': 3}
解説
dict1
がベースとなり、その上にdict2
が展開されて結合されています。- 注意点として、
**
演算子を使用するため、dict2
のキーが文字列である必要があります。
使用場面
- 基本的な辞書結合に加えて、新しいキーと値を追加したい場合。
- Pythonのバージョンが3.5以降である必要があります。
3.2 collections.ChainMap
を使用
特徴
Python標準ライブラリのcollections
モジュールに含まれるChainMap
クラスは、複数の辞書を一時的にまとめて操作する場合に便利です。この方法では、辞書は結合されず、オリジナルの辞書が保持されます。
コード例
from collections import ChainMap
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
combined = ChainMap(dict1, dict2)
print(combined['b']) # 2
print(combined['c']) # 4
解説
ChainMap
は複数の辞書を仮想的に1つの辞書として扱います。- キーの検索は最初に指定された辞書から優先的に行われます。この例では、
'b'
の値としてdict1
の値(2
)が選択されています。
使用場面
- 辞書を実際に結合せず、動的に操作する必要がある場合。
- 大量のデータを扱う際、メモリ効率を重視したい場合。

4. 辞書結合の注意点
辞書を結合する際には、いくつか注意すべき点があります。これらを理解しておくことで、予期しないエラーやデータの不整合を防ぐことができます。
4.1 重複キーの挙動
辞書を結合するとき、重複するキーが存在する場合は、後から指定した辞書の値が優先されます。
例
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
combined = {**dict1, **dict2}
print(combined) # {'a': 1, 'b': 3, 'c': 4}
この例では、キー'b'
の値としてdict2
の値(3
)が選択されています。この挙動を把握しておくことが重要です。
4.2 パフォーマンスの違い
辞書の結合方法によってパフォーマンスが異なる場合があります。特に、大量のデータを扱う場合は注意が必要です。
パフォーマンス比較(概要)
update()
メソッドは効率的ですが、元の辞書を変更するため、バックアップが必要な場合には不向きです。- アンパック演算子(
**
)は非破壊的で便利ですが、大量データではメモリ使用量が増加する可能性があります。 ChainMap
は辞書を実際に結合しないため、メモリ効率が高いです。
5. 各手法の比較と選択ガイド
辞書結合のさまざまな方法を比較し、適切な手法を選択するための指針を提供します。
5.1 手法の比較表
手法 | 破壊的/非破壊的 | バージョン | 重複キー挙動 | パフォーマンス |
---|---|---|---|---|
update() | 破壊的 | 全バージョン | 後の辞書が優先 | 高速 |
アンパック演算子(** ) | 非破壊的 | 3.5以降 | 後の辞書が優先 | 中程度 |
マージ演算子(| ) | 非破壊的 | 3.9以降 | 後の辞書が優先 | 中程度 |
ChainMap | 非破壊的 | 全バージョン | 最初の辞書が優先 | 高効率(メモリ) |
5.2 選択ガイド
- Python 3.9以降の場合:
- 最もシンプルで可読性の高い
|
演算子を推奨。 - Python 3.5~3.8の場合:
- アンパック演算子(
**
)を使用すると良いでしょう。 - 大量データやメモリ効率を重視する場合:
ChainMap
を使用するのが最適です。- 破壊的操作を許容する場合:
update()
メソッドが効率的です。

6. よくある質問(FAQ)
ここでは、Pythonの辞書結合に関する読者のよくある疑問を解決します。エラーの原因や特殊なケースへの対応方法についても解説します。
6.1 辞書結合でエラーが出るのはなぜですか?
問題例
以下のコードを実行するとエラーが発生します。
dict1 = {'a': 1, 'b': 2}
dict2 = {('c',): 3}
combined_dict = {**dict1, **dict2}
原因
アンパック演算子(**
)を使用する場合、キーが文字列でなければエラーになります。上記の例では、dict2
のキー('c',)
がタプルであるためエラーが発生しています。
解決方法
キーが文字列でない場合はupdate()
メソッドを使用するか、ループ処理で辞書を手動で結合します。
dict1 = {'a': 1, 'b': 2}
dict2 = {('c',): 3}
dict1.update(dict2) # 正常に動作
print(dict1) # {'a': 1, 'b': 2, ('c',): 3}
6.2 Python 3.9未満で|
演算子を使いたい場合の代替手法は?
回答
Python 3.9未満では、|
演算子は使用できませんが、アンパック演算子(**
)を使用することで同様の結果を得ることができます。
例
Python 3.8以前でも以下のコードを使用できます。
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
combined_dict = {**dict1, **dict2}
print(combined_dict) # {'a': 1, 'b': 3, 'c': 4}
6.3 辞書のネストがある場合の結合方法は?
問題
ネストされた辞書を結合したい場合、通常の方法では期待通りに動作しない場合があります。
dict1 = {'a': {'x': 1}}
dict2 = {'a': {'y': 2}}
combined_dict = {**dict1, **dict2}
print(combined_dict) # {'a': {'y': 2}}
上記の例では、'a'
キーがdict2
によって上書きされ、dict1
の値が失われています。
解決方法
ネストされた辞書をマージするには、再帰的な処理が必要です。
def merge_dicts(d1, d2):
result = d1.copy()
for key, value in d2.items():
if key in result and isinstance(result[key], dict) and isinstance(value, dict):
result[key] = merge_dicts(result[key], value)
else:
result[key] = value
return result
dict1 = {'a': {'x': 1}}
dict2 = {'a': {'y': 2}}
combined_dict = merge_dicts(dict1, dict2)
print(combined_dict) # {'a': {'x': 1, 'y': 2}}
6.4 マージ演算子で複数の辞書を一度に結合できますか?
回答
Python 3.9以降では、複数の辞書を一度に結合する場合、マージ演算子を連続して使用する必要があります。
例
dict1 = {'a': 1}
dict2 = {'b': 2}
dict3 = {'c': 3}
combined_dict = dict1 | dict2 | dict3
print(combined_dict) # {'a': 1, 'b': 2, 'c': 3}
複数の辞書を結合する場合、アンパック演算子でも同様の結果が得られます。
combined_dict = {**dict1, **dict2, **dict3}
print(combined_dict) # {'a': 1, 'b': 2, 'c': 3}
6.5 大量データでの辞書結合に最適な方法は?
回答
大量データを扱う場合、ChainMap
を使用することで効率的に結合できます。ChainMap
は辞書を実際に結合しないため、メモリ消費を抑えることができます。
例
from collections import ChainMap
dict1 = {'a': 1}
dict2 = {'b': 2}
combined = ChainMap(dict1, dict2)
print(combined['a']) # 1
print(combined['b']) # 2

7. まとめ
この記事では、Pythonで辞書を結合するさまざまな方法について解説しました。基本から最新の手法まで、初心者でも理解できるように具体例を交えて説明しました。
主なポイント
update()
メソッドは、元の辞書を変更するシンプルで効率的な方法です。- アンパック演算子(
**
)は非破壊的で、新しい辞書を作成する場合に便利です。 - マージ演算子(
|
)はPython 3.9以降で利用でき、コードをシンプルで可読性の高いものにします。 ChainMap
は、大量データを効率的に扱いたい場合に有効で、メモリを節約できます。
各手法にはそれぞれの特性があるため、目的や状況に応じて最適な方法を選ぶことが重要です。例えば、大量データの処理や辞書の重複キーに注意する場合には、ChainMap
やアンパック演算子が有効です。
今後、実際のプロジェクトで辞書を結合する際には、この記事で学んだ手法をぜひ活用してください。実際のコードで試してみることが、最も効果的に理解を深める方法です。さらに、Pythonの他のデータ操作に関する記事もぜひチェックしてみてください。