Pythonお悩み解決

Pythonに関する疑問や悩みにこたえるブログです

辞書をマージ(結合)したい

Pythonで辞書をマージ(結合)する方法を紹介します。

いくつか方法があるので、それぞれ説明します。

演算子 | を使う

Python 3.9以降であれば、辞書をマージするのに演算子|が使えます。

>>> d1 = {'k1': 'v11', 'k2': 'v12'}
>>> d2 = {'k2': 'v22', 'k3': 'v23'}
>>> # 演算子 | を使ってマージ
>>> d1 | d2
{'k1': 'v11', 'k2': 'v22', 'k3': 'v23'}
>>> d2 | d1
{'k2': 'v12', 'k3': 'v23', 'k1': 'v11'}

上記の様に、キー値が異なる要素(この場合は k1k3)はそのままマージされます。

また、同じキー値をもつ要素(この場合は k2)については | の後に書いた辞書の要素が優先されます。

なお、| を使っても元の辞書には影響がありません。

>>> # 元の辞書はそのまま
>>> d1
{'k1': 'v11', 'k2': 'v12'}
>>> d2
{'k2': 'v22', 'k3': 'v23'}

元の辞書を更新する演算子 |=

元の辞書を更新したい場合は、演算子|=を使います。

>>> # d1を上書きする
>>> d1 |= d2
>>> d1
{'k1': 'v11', 'k2': 'v22', 'k3': 'v23'}

Python 3.9以降をお使いであれば、||=を使うのが良いでしょう。

辞書のアンパックを使う

辞書のアンパックを使う方法もあります。

>>> d1 = {'k1': 'v11', 'k2': 'v12'}
>>> d2 = {'k2': 'v22', 'k3': 'v23'}
>>> # アンパックを使ってマージ
>>> {**d1, **d2}
{'k1': 'v11', 'k2': 'v22', 'k3': 'v23'}
>>> {**d2, **d1}
{'k2': 'v12', 'k3': 'v23', 'k1': 'v11'}

しかし、この方法は、あまり直感的ではありません。

パッと見ただけでは、2つの辞書をマージしていることが分かりにくいと思います。

update() メソッドを使う

辞書のupdate()メソッドを使う方法もあります。

>>> d1 = {'k1': 'v11', 'k2': 'v12'}
>>> d2 = {'k2': 'v22', 'k3': 'v23'}
>>> # update() メソッドを使ってマージ
>>> d1.update(d2)
>>> d1
{'k1': 'v11', 'k2': 'v22', 'k3': 'v23'}

しかし、update()メソッドは元の辞書を更新してしまうため、元の辞書を変更したくない場合には使えません。

まとめ

Pythonで辞書をマージする方法を紹介しました。

Python 3.9以降であれば、演算子 | |= を使う方法が良いでしょう。