この記事ではPythonの2つのdict(辞書)を結合する方法をご紹介します。
Pythonの辞書の結合方法にはたくさんの種類がありますが、その方法によって
- 記述量
- 処理速度
が異なります。
これからご紹介する結合方法では次のグラフのように処理速度が異なります。
記述量と処理速度を考慮し、Pythonのバージョン別におすすめの辞書の結合方法をご紹介します。
x | y – Python3.9 ~
Python3.9からは以下のようにdictを結合できます。
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 3, 'c': 4}
>>> z = x | y
>>> print(z)
{'a': 1, 'b': 3, 'c': 4}
辞書yのbの値が辞書xのbの値を上書きしていることに注意してください。
この新しい構文はPEP 584で提案されて、課題36144で議論されています。
{**x, **y} – Python3.5 ~
Python3.5からは次のようにしてdictを結合できます。
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 3, 'c': 4}
>>> z = {**x, **y}
>>> print(z)
{'a': 1, 'b': 3, 'c': 4}
辞書yのbの値が辞書xのbの値を上書きしていることに注意してください。
また、次のように結合時に新しい値を入れたり、bの値を新しい値に上書きすることもできます。
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 3, 'c': 4}
>>> z = {**x, 'e': 1, **y, 'f': 2, 'b': 4}
>>> print(z)
{'a': 1, 'b': 4, 'e': 1, 'c': 4, 'f': 2}
この構文はPEP 448で提案されてPython3.5以降で使用できるようになりました。
copy() update() – Python2 ~ 3.4
Python2 ~ 3.4まではcopy()
とupdate()
を使って次のように辞書を結合します。
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 3, 'c': 4}
>>> z = x.copy()
>>> z.update(y)
>>> print(z)
{'a': 1, 'b': 3, 'c': 4}
おすすめできない結合方法
ここまででご紹介した結合方法の他にも次の様に辞書を結合する方法がありますが、これらの方法で結合するのはおすすめできません。
dict(x.items() + y.items())
dict(list(x.items()) + list(y.items()))
dict(chain(x.items(), y.items()))
おすすめできない辞書結合: dict(x.items() + y.items())
Python2ではdict(x.items() + y.items())
でdictを結合できましたが、Python3ではエラーが出ます。
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 3, 'c': 4}
>>> z = dict(x.items() + y.items())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'
Python2とPython3では結合の方法が異なります。
Python2では上記のコードでxとyのリストをメモリ上に作成して、そして結合したリストをメモリ上に作成。
その後、メモリ上にある3つのリストを削除して結合した辞書を作ります。
それに対し、Python3ではエラー文でもある通り、2つのdict_itemsを一緒に追加しています。
おすすめできない辞書結合: dict(list(x.items()) + list(y.items()))
上記の通りdict(x.items() + y.items())
がPython3では使えませんが、以下のように修正するとPython3でも動きます。
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 3, 'c': 4}
>>> z = dict(list(x.items()) + list(y.items()))
>>> print(z)
{'a': 1, 'b': 3, 'c': 4}
この様に修正するとPython2と同じ様に動きますが、メモリを消費します。
メモリを消費しなく、早く結合する方法があるのでそちらを使いましょう。
おすすめできない辞書結合: dict(chain(x.items(), y.items()))
chain()
を使って辞書の結合がおすすめできないのは単純に遅いからです。
>>> from itertools import chain
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 3, 'c': 4}
>>> z = dict(chain(x.items(), y.items()))
>>> print(z)
{'a': 1, 'b': 3, 'c': 4}
コメント