一般に、Python で辞書の共通部分を作成するには、まず&
演算子を使用して辞書キーの集合の共通部分を計算します (辞書キーはPython 3 では集合のようなオブジェクトです)。
dict_a = {"a": 1, "b": 2}
dict_b = {"a": 2, "c": 3}
intersection = dict_a.keys() & dict_b.keys() # {'a'}
Python 2 では、辞書のキーを自分でセットに変換する必要があります。
keys_a = set(dict_a.keys())
keys_b = set(dict_b.keys())
intersection = keys_a & keys_b
次に、キーの交差が与えられたら、必要に応じて値の交差を構築できます。ここで選択を行う必要があります。集合交差の概念では、関連付けられた値が異なる場合に何をすべきかがわからないためです。(これがおそらく、&
交差演算子が Python の辞書に対して直接定義されていない理由です)。
この場合、同じキーの値が等しいように聞こえるので、辞書の 1 つから値を選択するだけです。
dict_of_dicts_a = {"a": {"x":1}, "b": {"y":3}}
dict_of_dicts_b = {"a": {"x":1}, "c": {"z":4}}
shared_keys = dict_of_dicts_a.keys() & dict_of_dicts_b.keys()
# values equal so choose values from a:
dict_intersection = {k: dict_of_dicts_a[k] for k in shared_keys } # {"a":{"x":1}}
値を結合する他の合理的な方法は、辞書内の値の型と、それらが何を表しているかによって異なります。たとえば、辞書の辞書の共有キーの値の結合も必要になる場合があります。辞書の結合は値に依存しないため、明確に定義されており、Python では|
演算子を使用して取得できます。
# union of values for each key in the intersection:
dict_intersection_2 = { k: dict_of_dicts_a[k] | dict_of_dicts_b[k] for k in shared_keys }
この場合、"a"
両方のキーの辞書値が同じであれば、同じ結果になります。