2012-03-22 12 views
56

オブジェクトの和集合をPythonでどのように計算するのですか?は、複写がない限り、がinの場合、結果に(key, value)のペアが存在しますか?Pythonのdictオブジェクトの連合

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

好ましくは、入力dictを変更せずにこれを行うことができます。これが役に立つ場所の例:Get a dict of all variables currently in scope and their values

+2

どのようにこの質問は、あなた自身の答えでリンクされたものとは異なりますか? –

+1

@RikPoggi:もう一つの質問は、そのタイトルにもかかわらず、 '** d2' *の構文*が何であるかを尋ねています。この質問に対する答えが出てきます。 –

答えて

55

This questionはイディオムを提供します。あなたはdict()コンストラクタのキーワード引数としてdictsのいずれかを使用します。

dict(y, **x) 

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

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

"シンプルは複合より優れています。" :) 'dict'の' update'メンバ関数を使うべきです。 – shahjapan

+12

'tmp = dict(y)はどうですか? tmp.update(x); do_something(tmp) 'シンプル? –

+6

@shahjapanこれは複雑ではありませんが、これはPythonのdict構造を大いに活用しています。これは更新とは異なります(このソリューションは何も更新していません)。 – lajarre

53

のためにまた、あなたは、両方のdictsは独立して、更新可能なままにする必要がある場合、あなたはその__getitem__で両方の辞書を照会する単一のオブジェクトを作成することができます

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

a.update(b) 
print a 
5

のように辞書のupdate方法を使用することができます必要に応じて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 
>>> 
18

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)) 
+12

または、はるかにわかりやすく、 'dict(私はdct.items()内のdictsのdctのために)' – Eric

+0

なぜリスト()に変換するのですか? 'def union2(dict1、dict2):' 'return dict(dict1.items()+ dict2.items())' – kinORnirvana

+1

@kinORnirvana Python 3では:a = {'x':1};タイプ(a.items())=><クラス 'dict_items'> –