[Tutor] creating a nested dictionary
Ricardo Aráoz
ricaraoz at gmail.com
Fri Jan 25 14:26:04 CET 2008
Kent Johnson wrote:
> Remco Gerlich wrote:
>> I can't think of a really good generalization, one that will work for
>> all depths. That's the sort of thing you use Lisp, combinators and lots
>> of coffee for. Perhaps later today.
>
> Some nice solutions here:
> http://groups.google.com/group/comp.lang.python/browse_thread/thread/9519c885a24a65ea/c9697fa73bb59709
>
> Kent
These solutions sometimes may have unexpected behavior.
class recursivedefaultdict(object):
def __init__(self):
self.__dd = defaultdict(recursivedefaultdict)
def __getattr__(self,attr):
return self.__dd.__getattribute__(attr)
def __getitem__(self,*args):
return self.__dd.__getitem__(*args)
def __setitem__(self,*args):
return self.__dd.__setitem__(*args)
d = recursivedefaultdict()
d['pepe']['jose']['juan'] = 25
d['pepe']['jose'] = 25
d['pepe']['martin'] = 33
[i for i in d['pepe']]
And it went into an infinite loop.
class recursivedefaultdict(defaultdict):
def __init__(self):
self.default_factory = type(self)
d = recursivedefaultdict()
d['pepe']['jose']['juan'] = 25
d['pepe']['jose'] = 25
d['pepe']['martin'] = 33
d
it prints : defaultdict(<class '__main__.hash'>, {'pepe':
defaultdict(<class '__main__.hash'>, {'jose': defaultdict(<class
'__main__.hash'>, {'juan': 25}), 'pedro': 25, 'martin': 33})})
[i for i in d['pepe']]
it prints : ['jose', 'pedro', 'martin']
expected : [defaultdict(<class '__main__.hash'>, {'jose':
defaultdict(<class '__main__.hash'>, {'juan': 25}), 'pedro': 25,
'martin': 33})]
[i for i in d]
it prints : ['pepe']
expected : [defaultdict(<class '__main__.hash'>, {'pepe':
defaultdict(<class '__main__.hash'>, {'jose': defaultdict(<class
'__main__.hash'>, {'juan': 25})})})]
Anyway it otherwise seems to behave properly :
a = d['pepe']
a
it prints : defaultdict(<class '__main__.hash'>, {'jose':
defaultdict(<class '__main__.hash'>, {'juan': 25}), 'pedro': 25,
'martin': 33})
as would be expected.
And class hash behaves like this last one.
class hash(defaultdict):
def __init__(self):
defaultdict.__init__(self, hash)
More information about the Tutor
mailing list