静的辞書の場合、他の辞書のスナップショットを組み合わせます。
Python 3.9以降、辞書を連結するためにバイナリの「or」演算子|
が定義されています。(新しい具体的な辞書が熱心に作成されています):
>>> a = {"a":1}
>>> b = {"b":2}
>>> a|b
{'a': 1, 'b': 2}
逆に、拡張代入は、メソッド|=
を呼び出すのと同じ意味で実装されています。update
>>> a = {"a":1}
>>> a |= {"b": 2}
>>> a
{'a': 1, 'b': 2}
詳しくはPEP-584をご確認ください
Python 3.9より前のバージョンでは、新しい辞書を作成する簡単な方法は、「スター拡張」を使用して新しい辞書を作成し、各サブディクショナリのコンテンツを適切に追加することです。
c = {**a, **b}
動的辞書の組み合わせの場合、組み合わせたライブ辞書の「ビュー」として機能します。
両方のディクショナリを独立して更新可能にする必要がある場合は、そのメソッドで両方のディクショナリをクエリする単一のオブジェクトを作成できます(必要に応じて、およびその他のマッピングメソッド__getitem__
を実装 します)。get
__contains__
ミニマリストの例は次のようになります。
class UDict(object):
def __init__(self, d1, d2):
self.d1, self.d2 = d1, d2
def __getitem__(self, item):
if item in self.d1:
return self.d1[item]
return self.d2[item]
そしてそれは機能します:
>>> a = UDict({1:1}, {2:2})
>>> a[2]
2
>>> a[1]
1
>>> a[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in __getitem__
KeyError: 3
>>>
注意:2つ以上の辞書のUnionの「ビュー」を怠惰に維持したい場合 collections.ChainMap
は、標準ライブラリをチェックしてください。これには、上記の例では想定されていないすべての辞書メソッドとカバーケースが含まれています。