質問
複数のディクショナリまたはマッピングがあり、それらを 1 つの Perform に論理的にマージしたいと考えています。値の検索や特定のキーが存在するかどうかの確認など、マッピング後の何らかの操作。
解決策
次の 2 つの辞書があるとします。
a = {'x': 1, 'z': 3 } b = {'y': 2, 'z': 4 }
次に、2 つの辞書で検索操作を実行する必要があるとします (たとえば、まず a から検索し、見つからない場合は b) を検索します。非常に簡単な解決策は、コレクション モジュールの ChainMap クラスを使用することです。例:
from collections import ChainMap c = ChainMap(a,b) print(c['x']) # Outputs 1 (from a) print(c['y']) # Outputs 2 (from b) print(c['z']) # Outputs 3 (from a)
Discussion
ChainMap は複数の辞書を受け入れ、論理的にそれらを 1 つの辞書に変換します。ただし、これらの辞書は実際にはマージされず、ChainMap クラスはこれらの辞書を保持するリストを内部的に作成し、このリストを走査するためのいくつかの一般的な辞書操作を再定義するだけです。ほとんどの辞書操作は通常どおりに使用できます。たとえば、次のようになります。
>>> len(c) 3 >>> list(c.keys()) ['x', 'y', 'z'] >>> list(c.values()) [1, 2, 3] >>>
重複キーが出現した場合は、マップされた値の最初の出現が返されます。したがって、プログラム例の c['z'] は、b の対応する値ではなく、常に辞書 a の対応する値を返します。
辞書を更新または削除すると、常にリストの最初の辞書に影響します。例:
>>> c['z'] = 10 >>> c['w'] = 40 >>> del c['x'] >>> a {'w': 40, 'z': 10} >>> del c['y'] Traceback (most recent call last): ... KeyError: "Key not found in the first mapping: 'y'" >>>
ChainMap は、プログラミング言語のスコープ変数 (グローバル、ローカルなど) に非常に役立ちます。実際、これを簡単にする方法がいくつかあります。
>>> values = ChainMap() >>> values['x'] = 1 >>> # Add a new mapping >>> values = values.new_child() >>> values['x'] = 2 >>> # Add a new mapping >>> values = values.new_child() >>> values['x'] = 3 >>> values ChainMap({'x': 3}, {'x': 2}, {'x': 1}) >>> values['x'] 3 >>> # Discard last mapping >>> values = values.parents >>> values['x'] 2 >>> # Discard last mapping >>> values = values.parents >>> values['x'] 1 >>> values ChainMap({'x': 1}) >>>
ChainMap の代わりに、update() メソッドを使用して 2 つの辞書をマージすることを検討することもできます。例:
>>> a = {'x': 1, 'z': 3 } >>> b = {'y': 2, 'z': 4 } >>> merged = dict(b) >>> merged.update(a) >>> merged['x'] 1 >>> merged['y'] 2 >>> merged['z'] 3 >>>
これも機能しますが、完全に異なる辞書オブジェクトを作成する (または既存の辞書構造を破棄する) 必要があります。同時に、元の辞書が更新された場合、この変更は新しい結合辞書には反映されません。例:
>>> a['x'] = 13 >>> merged['x'] 1
ChianMap は元の辞書を使用し、新しい辞書自体は作成しません。したがって、上記のような結果は生成されません。
>>> a = {'x': 1, 'z': 3 } >>> b = {'y': 2, 'z': 4 } >>> merged = ChainMap(a, b) >>> merged['x'] 1 >>> a['x'] = 42 >>> merged['x'] # Notice change to merged dicts 42 >>>
推奨チュートリアル: "Python Tutorial"
以上がPython で複数の辞書またはマッピングをマージするチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。