a = {'a' : {'b' : '1'}}
b = {'a' : {'c' : '2'}}
aset = set(a)
bset = set(b)
c=dict()
#first common keys
for name in aset.intersection(bset):
c[name]=dict(a[name], **b[name])
#keys in a but not in b
for name in aset-bset:
c[name]=a[name]
#keys in b but not in a
for name in bset-aset:
c[name]=b[name]
#print fully merged c
print(c)
>>> {'a': {'b': '1', 'c': '2'}}
I used sets to simplify finding common keys etc, you can check this question.
On a more complete example:
a = {'a' : {'b' : '1'},'e':{'l':'2'},'f':{'x':'10'}}
b = {'a' : {'c' : '2'},'e':{'i':'2'},'g':{'z':'12'}}
aset = set(a)
bset = set(b)
c=dict()
for name in aset.intersection(bset):
c[name]=dict(a[name], **b[name])
for name in aset-bset:
c[name]=a[name]
for name in bset-aset:
c[name]=b[name]
print(c)
>>> {'a': {'b': '1', 'c': '2'}, 'e': {'l': '2', 'i': '2'}, 'f': {'x': '10'}, 'g': {'z': '12'}}