On Oct 4, 4:35 pm, Gary Coulbourne <[EMAIL PROTECTED]> wrote: > >>> dict1={1: 4, 3: 5}... and 2 millions element > >>> dict2={3: 3, 8: 6}... and 3 millions element > > If you don't mind doing some kind of lazy evaluation, you could do > something like... > > ------------------------------ > dict1={1:4, 3:5} > dict2={3:3, 8:6} > > import UserDict > > class Merge(UserDict.DictMixin): > > def __init__(self,d1,d2): > self.dict1 = d1 > self.dict2 = d2 > > keyset = set(d1.keys()) > keyset.update(d2.keys()) > > self.dkeys = list(keyset) > > def keys(self): > return self.dkeys > > def __getitem__(self,key): > v1 = 0 > v2 = 0 > if key in self.dict1: > v1 = self.dict1[key] > if key in self.dict2: > v2 = self.dict2[key] > return v1+v2
Generalising to support any number of dicts reduces the amount of code somewhat: import UserDict class Merge(UserDict.DictMixin): def __init__(self, *args): self._dicts = args self._keys = list(set(k for d in self._dicts for k in d)) def keys(self): return self._keys def __getitem__(self, key): return sum(d.get(key, 0) for d in self._dicts) -- Paul Hankin -- http://mail.python.org/mailman/listinfo/python-list