191

dictPythonで 2 つのオブジェクトの結合を計算するにはどうすればよいですか?(key, value)結果にペアが存在する場合、いずれかの dict である場合 (重複がない限り) key?in

たとえば、 と の結合{'a' : 0, 'b' : 1}{'c' : 2}です{'a' : 0, 'b' : 1, 'c' : 2}

できれば、どちらの入力も変更せずにこれを行うことができますdict。これが役立つ例:現在スコープ内にあるすべての変数とその値の辞書を取得する

4

4 に答える 4

150

この質問はイディオムを提供します。dict()辞書の 1 つをコンストラクターへのキーワード引数として使用します。

dict(y, **x)

重複は の値を優先して解決されxます。例えば

dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'}
于 2012-03-22T09:37:17.293 に答える
117

updatedict のようなメソッドを使用することもできます

a = {'a' : 0, 'b' : 1}
b = {'c' : 2}

a.update(b)
print a
于 2012-03-22T09:54:27.030 に答える
42

静的辞書の場合、他の辞書のスナップショットを組み合わせます。

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は、標準ライブラリをチェックしてください。これには、上記の例では想定されていないすべての辞書メソッドとカバーケースが含まれています。

于 2012-03-22T11:24:26.590 に答える
36

2 つの辞書

def union2(dict1, dict2):
    return dict(list(dict1.items()) + list(dict2.items()))

n辞書

def union(*dicts):
    return dict(itertools.chain.from_iterable(dct.items() for dct in dicts))
于 2012-10-17T01:56:01.090 に答える