Search code examples
pythonautovivification

What's the best way to initialize a dict of dicts in Python?


A lot of times in Perl, I'll do something like this:

$myhash{foo}{bar}{baz} = 1

How would I translate this to Python? So far I have:

if not 'foo' in myhash:
    myhash['foo'] = {}
if not 'bar' in myhash['foo']:
    myhash['foo']['bar'] = {}
myhash['foo']['bar']['baz'] = 1

Is there a better way?


Solution

  • class AutoVivification(dict):
        """Implementation of perl's autovivification feature."""
        def __getitem__(self, item):
            try:
                return dict.__getitem__(self, item)
            except KeyError:
                value = self[item] = type(self)()
                return value
    

    Testing:

    a = AutoVivification()
    
    a[1][2][3] = 4
    a[1][3][3] = 5
    a[1][2]['test'] = 6
    
    print a
    

    Output:

    {1: {2: {'test': 6, 3: 4}, 3: {3: 5}}}