PYTHON MEBY

Pythonで辞書を結合(update, {**dict1, **dict2} (Python 3.5以降))

この記事では、Pythonで辞書を結合する様々な方法について解説します。updateメソッド、**演算子を用いた方法、それぞれのメリット・デメリットを比較し、効率的な結合方法を紹介します。

目次

updateメソッドによる結合

辞書オブジェクトのupdateメソッドは、別の辞書のキーと値を現在の辞書に追加します。既存のキーが存在する場合は、新しい値で上書きされます。

dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
dict1.update(dict2)
print(dict1)  # 出力: {'a': 1, 'b': 3, 'c': 4}

updateメソッドは、元の辞書を直接変更します。新しい辞書を作成せずに済むため、メモリ効率が良いです。

{**dict1, **dict2}による結合 (Python 3.5以降)

Python 3.5以降では、**演算子を用いて辞書を簡単に結合できます。これは、複数の辞書を一つの辞書にまとめる簡潔な方法です。既存のキーが存在する場合は、右側の辞書の値で上書きされます。

dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
merged_dict = {**dict1, **dict2}
print(merged_dict)  # 出力: {'a': 1, 'b': 3, 'c': 4}

この方法は、可読性が高く、複数の辞書を結合する場合にも便利です。ただし、元の辞書は変更されません。新しい辞書が作成されます。

注意点とエラーハンドリング

辞書を結合する際に、キーの重複や、予期しないエラーへの対処が必要です。

  • キーが重複した場合、後続の辞書の値で上書きされます。
  • 値の型に注意してください。異なる型の値を結合すると、予期しない結果になる可能性があります。
  • 例外処理 (try-exceptブロック) を使用してエラーを安全に処理することを推奨します。

パフォーマンス比較

updateメソッドと**演算子のパフォーマンスは、辞書のサイズによって異なります。一般的に、小さな辞書の場合は両者のパフォーマンス差はわずかですが、大きな辞書の場合はupdateメソッドの方が高速な場合があります。ただし、可読性とコードの簡潔さを考慮すると、**演算子も有効な選択肢です。

import timeit
dict1 = {i: i for i in range(10000)}
dict2 = {i: i*2 for i in range(10000)}

time_update = timeit.timeit(lambda: dict1.update(dict2), number=1000)
time_unpack = timeit.timeit(lambda: {**dict1, **dict2}, number=1000)

print(f"updateメソッド: {time_update:.4f}秒")
print(f"**演算子: {time_unpack:.4f}秒")

関連記事