Nested defaultdict of defaultdict
The other answers here tell you how to create a defaultdict
which contains "infinitely many" defaultdict
, but they fail to address what I think may have been your initial need which was to simply have a two-depth defaultdict.
You may have been looking for:
defaultdict(lambda: defaultdict(dict))
The reasons why you might prefer this construct are:
- It is more explicit than the recursive solution, and therefore likely more understandable to the reader.
- This enables the "leaf" of the
defaultdict
to be something other than a dictionary, e.g.,:defaultdict(lambda: defaultdict(list))
ordefaultdict(lambda: defaultdict(set))
For an arbitrary number of levels:
def rec_dd():
return defaultdict(rec_dd)
>>> x = rec_dd()
>>> x['a']['b']['c']['d']
defaultdict(<function rec_dd at 0x7f0dcef81500>, {})
>>> print json.dumps(x)
{"a": {"b": {"c": {"d": {}}}}}
Of course you could also do this with a lambda, but I find lambdas to be less readable. In any case it would look like this:
rec_dd = lambda: defaultdict(rec_dd)