今回は、Pythonでdict(辞書)を結合する方法についてご紹介します。
Pythonのdictとは
Pythonのdictは、キーと値のペアを格納できる組み込みのデータ型です。
キーは文字列や数値などの不変(イミュータブル)なオブジェクトが利用でき、値には任意のオブジェクトを格納できます。
キーを用いて辞書内の値に素早くアクセスできるため、データの検索や管理に便利です。
Pythonのdictを結合するには
Pythonでは、dictを結合する手段が複数用意されています。
結合といっても、「元の辞書を書き換えるのか」「新しい辞書を作るのか」で使える方法が異なります。
ここでは、代表的な方法をいくつかご紹介します。
1. update() メソッドを使う方法
update()は、既存の辞書に対して別の辞書の内容を上書きで結合するメソッドです。
インプレース操作なので、元の辞書そのものが変更される点に注意してください。
1 2 3 4 5 6 |
dict1 = {'a': 1, 'b': 2} dict2 = {'b': 3, 'c': 4} # dict1にdict2を上書きでマージする dict1.update(dict2) print(dict1) |
{‘a’: 1, ‘b’: 3, ‘c’: 4}
2. 辞書のアンパック(**)を使う方法
Python 3.5以降で利用可能な辞書のアンパックを用いると、新しい辞書を簡単に生成できます。
後ろに指定した辞書の同じキーが優先されるので、キーが重複している場合は注意しましょう。
1 2 3 4 5 |
dict1 = {'a': 1, 'b': 2} dict2 = {'b': 3, 'c': 4} merged = {**dict1, **dict2} print(merged) |
{‘a’: 1, ‘b’: 3, ‘c’: 4}
3. Union演算子(Python 3.9以降)を使う方法
Python 3.9からは、dict同士を結合するための演算子「|」と「|=」が提供されています。
| 演算子は新しい辞書を作り、|= 演算子は既存の辞書を更新します。
1 2 3 4 5 6 7 8 9 10 |
dict1 = {'a': 1, 'b': 2} dict2 = {'b': 3, 'c': 4} # 新しい辞書を作る場合 merged = dict1 | dict2 print(merged) # 既存のdict1を直接更新する場合 dict1 |= dict2 print(dict1) |
{‘a’: 1, ‘b’: 3, ‘c’: 4}
{‘a’: 1, ‘b’: 3, ‘c’: 4}
4. forループを使った手動マージ
結合後の辞書を自由に操作したい場合や、特定の条件を加えたい場合は、forループによる手動マージが便利です。
まずコピーした辞書に対して、もう一方の辞書のキーと値を上書きしていきます。
1 2 3 4 5 6 7 |
dict1 = {'a': 1, 'b': 2} dict2 = {'b': 3, 'c': 4} merged = dict1.copy() # 元の辞書を保護するためコピーする for key, value in dict2.items(): merged[key] = value print(merged) |
{‘a’: 1, ‘b’: 3, ‘c’: 4}
5. 辞書内包表記を使う方法
複数の辞書をまとめて新しい辞書を生成する場合、辞書内包表記が使えます。
後ろに続く辞書が同じキーを持っている場合は、後のものが上書きする点に注意してください。
1 2 3 4 5 |
dict1 = {'a': 1, 'b': 2} dict2 = {'b': 3, 'c': 4} merged = {key: value for d in (dict1, dict2) for key, value in d.items()} print(merged) |
{‘a’: 1, ‘b’: 3, ‘c’: 4}
6. collections.ChainMapを利用する方法
collections.ChainMapを使うと、複数の辞書をあたかも一つの辞書のように参照することができます。
実際にはデータが結合されるわけではなく、連鎖的な参照によって値が検索されます。
1 2 3 4 5 6 7 8 |
from collections import ChainMap dict1 = {'a': 1, 'b': 2} dict2 = {'b': 3, 'c': 4} merged = ChainMap(dict2, dict1) print(merged) print(merged['b']) |
ChainMap({‘b’: 3, ‘c’: 4}, {‘a’: 1, ‘b’: 2})
3
7. functools.reduceを使った方法
辞書が複数あり、一気にマージしたいときには、functools.reduceを使う方法もあります。
関数型プログラミングの手法で、リストにまとめた辞書を順次マージしていきます。
1 2 3 4 5 6 7 8 9 10 |
from functools import reduce dict_list = [ {'a': 1, 'b': 2}, {'b': 3, 'c': 4}, {'d': 5} ] merged = reduce(lambda a, b: {**a, **b}, dict_list) print(merged) |
{‘a’: 1, ‘b’: 3, ‘c’: 4, ‘d’: 5}
よくあるエラーと注意点
dictの結合を行う際、キーの重複による上書きに注意が必要です。
想定外のデータが上書きされることを防ぐには、結合前にキーが重複していないかチェックすることをおすすめします。
また、Pythonのバージョンにも注意が必要です。
アンパック(**)はPython 3.5以降、Union演算子はPython 3.9以降でのみ利用可能です。
環境に合わせて適切な手段を選択してください。
さらに、浅いマージであるため、値としてリストや辞書が格納されている場合は、その内部までマージされない点も覚えておくと便利です。
まとめ
Pythonのdict結合にはさまざまな方法がありますが、バージョンの制約や上書きの特性を踏まえて選ぶことが大切です。
update()のようにインプレース操作する手段から、新しい辞書を生成する方法まで、場面に応じて使い分けてください。
それぞれの使い方と注意点を理解しておくと、柔軟にデータを扱えるようになります。