Merging two Python dictionaries by deep-updating
Sunday, May 7th, 2017
Say we have two Python dictionaries:
{
'name': 'Ferry',
'hobbies': ['programming', 'sci-fi']
}
and
{
'hobbies': ['gaming']
}
What if we want to merge these two dictionaries such that “gaming” is added to the “hobbies” key of the first dictionary? I couldn’t find anything online that did this already, so I wrote the following function for it:
# Copyright Ferry Boender, released under the MIT license. def deepupdate(target, src): """Deep update target dict with src For each k,v in src: if k doesn't exist in target, it is deep copied from src to target. Otherwise, if v is a list, target[k] is extended with src[k]. If v is a set, target[k] is updated with v, If v is a dict, recursively deep-update it. Examples: >>> t = {'name': 'Ferry', 'hobbies': ['programming', 'sci-fi']} >>> deepupdate(t, {'hobbies': ['gaming']}) >>> print t {'name': 'Ferry', 'hobbies': ['programming', 'sci-fi', 'gaming']} """ for k, v in src.items(): if type(v) == list: if not k in target: target[k] = copy.deepcopy(v) else: target[k].extend(v) elif type(v) == dict: if not k in target: target[k] = copy.deepcopy(v) else: deepupdate(target[k], v) elif type(v) == set: if not k in target: target[k] = v.copy() else: target[k].update(v.copy()) else: target[k] = copy.copy(v)
It uses a combination of deepcopy()
, updating and self recursion to perform a complete merger of the two dictionaries.
As mentioned in the comment, the above function is released under the MIT license, so feel free to use it any of your programs.