Cerin - 2 years ago 128
Python Question

# Infinitely Nested Dictionary in Python

Does anyone know if there's a standard class for an infinitely nestable dictionary in Python?

I'm finding myself repeating this pattern:

``````d = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))
d['abc']['def']['xyz'] += 1
``````

If I want to add "another layer" (e.g.
`d['abc']['def']['xyz']['wrt']`
), I have to define another nesting of defaultdicts.

To generalize this pattern, I've written a simple class that overrides
`__getitem__`
to automatically create the next nested dictionary.

e.g.

``````d = InfiniteDict(('count',0),('total',0))
d['abc']['def']['xyz'].count += 0.24
d['abc']['def']['xyz'].total += 1
d['abc']['def']['xyz']['wrt'].count += 0.143
d['abc']['def']['xyz']['wrt'].total += 1
``````

However, does anyone know of a pre-existing implementation of this idea? I've tried Googling, but I'm not sure what this would be called.

You can derive from `defaultdict` to get the behavior you want:

``````class InfiniteDict(defaultdict):
def __init__(self):
defaultdict.__init__(self, self.__class__)

class Counters(InfiniteDict):
def __init__(self):
InfiniteDict.__init__(self)
self.count = 0
self.total = 0

def show(self):
print "%i out of %i" % (self.count, self.total)
``````

Usage of this class would look like this:

``````>>> d = Counters()
>>> d[1][2][3].total = 5
>>> d[1][2][3].show()
0 out of 5
>>> d[5].show()
0 out of 0
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download