Recursively Default Dictionaries
Today I was asked if I knew how to make a recursively default dictionary (although not in so many words). What that means is that it’s a dictionary (or hash) which is defaulted to an empty version of itself for every item access. That way, you can throw data into a multi-dimensional dictionary without regard for whether keys already exist, like so:
h["a"]["b"]["c"] = 5
Without having to first initialise h[“a”] and h[“a”][“b”].
A dictionary with a default value of an empty hash sprang to mind, but after trying it out I realised that this only works for one level. Recursion was evidently required.
So, here’s the python solution:
from collections import defaultdict
new_dict = lambda: defaultdict(new_dict)
h = defaultdict(new_dict)
And the ruby, which seems overly noisy:
new_hash = lambda { |hash, key| hash[key] = Hash.new &new_hash }
h = Hash.new(&new_hash)