Python

【Python】2つの辞書を1つにする方法【マージ】

この記事では、辞書をマージする方法を紹介します。

マージって?

マージとは、複数あるものを1つにすること

Python3.9では、辞書をマージできる演算子も追加されました。是非とも知っておきましょう❗️

update()メソッド

dict型のupdateメソッドを使うことで、辞書をマージすることができる。

d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'd': 4}

d1.update(d2)

print(d1)
>> {'a': 1, 'b': 3, 'd': 4}
  • 元の辞書自体が変更される
  • キーが被った場合は、引数の値が優先される

元の辞書を変更したくない場合は、一時変数を使う。

d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'd': 4}

# 一時変数にd1をコピー
temp = d1.copy()
# 一時変数をupdate
temp.update(d2)

print(temp)

dict()

dictコンストラクタの第一引数に辞書、第二引数にキーワード引数として展開した辞書を渡すことでマージできます。

d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'd': 4}

d3 = dict(d1, **d2)

print(d3)
>> {'a': 1, 'b': 3, 'd': 4}
  • 新たな辞書を生成できる
  • キーが被った場合は、キーワード引数の値が優先される
  • d2が文字列キーしか持たない場合にのみ使用可能

{**d1, **d2}

Python3.5以上で使用可能

辞書リテラルに展開した辞書を渡すことでマージすることができます。

d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'd': 4}

d3 = {**d1, **d2}

print(d3)
>> {'a': 1, 'b': 3, 'd': 4}
  • 新たな辞書を生成できる
  • キーが被った場合は、後者に指定した辞書の値が優先される
  • 見た目が汚い

collections.ChainMap

標準ライブラリであるcollectionsモジュールのChainMapクラスを使うことでマージできます。

ChainMap は、複数の辞書やその他のマッピングをまとめて、一つの、更新可能なビューを作成します。 maps が指定されないなら、一つの空辞書が与えられますから、新しいチェーンは必ず一つ以上のマッピングをもちます。

根底のマッピングはリストに保存されます。このリストはパブリックで、 maps 属性を使ってアクセスや更新できます。それ以外に状態はありません。

探索は、根底のマッピングをキーが見つかるまで引き続き探します。対して、書き込み、更新、削除は、最初のマッピングのみ操作します。

ChainMap は、根底のマッピングを参照によって組み込みます。ですから、根底のマッピングの一つが更新されると、その変更は ChainMap に反映されます。

collections — コンテナデータ型 — Python 3.9.4 ドキュメント

from collections import ChainMap

d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'd': 4}

cm = ChainMap(d1, d2)

print(cm)
>> ChainMap({'a': 1, 'b': 2}, {'b': 3, 'd': 4})
print(cm['b'])
>> 2
  • update()を繰り返すより高速
  • 参照を使っているので元の辞書にも影響を与える
  • キーが被った場合は、前者に指定した辞書の値が優先

以下のように書き換えた場合は、元の辞書の値も変わってしまいます。

from collections import ChainMap

d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'd': 4}

cm = ChainMap(d1, d2)

# 書き換える
cm['b'] = 5
cm['d'] = 6

print(d1)
>> {'a': 1, 'b': 5, 'd': 6}
print(d2)
>> {'b': 3, 'd': 4}

更新は最初に指定した辞書のみ行われる。もし、2つ目以降の辞書を更新したい場合は、サブクラスを作成することで実現できる。

マージ演算子

Python3.9以上で使用可能

「|」または「|=」を使うことで簡単に辞書をマージできるようになりました。

d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'd': 4}

print(d1 | d2)
>> {'a': 1, 'b': 3, 'd': 4}


d1 |= d2

print(d1)
>> {'a': 1, 'b': 3, 'd': 4}
  • キーが被った場合は、後者に指定した辞書の値が優先
最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』
今なら3日以内のカウンセリング枠を予約&参加で「1,000円分のAmazonギフト券」をプレゼント!