web-dev-qa-db-ja.com

Pythonのdictオブジェクトの連合

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

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

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

106

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

dict(y, **x)

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

dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'}
90

update dictのメソッドを使用することもできます

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

a.update(b)
print a
81
Nilesh

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))
24
Mathieu Larose

両方の辞書を独立して更新可能にする必要がある場合は、__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
>>> 
8
jsbueno