Самое простое сделать это рекурсивно:
import collections
def flattendict(d, prefix=()):
r = {}
for k, v in d.iteritems():
pk = prefix + (k,)
if isinstance(v, collections.Mapping):
r.update(flattendict(v, pk))
else:
r['_'.join(pk)] = v
return r
Вот пример использования:
d = {'foo': 'bar',
'baz': {'fie': 'foo', 'zip': 'zap'},
'bam': {'fie': 'foo', 'zip': {'zap': 'zup', 'mep': 'mop'}},
}
print flattendict(d)
производство (возможно, конечно, в другом порядке)
{'baz_zip': 'zap', 'bam_fie': 'foo', 'foo': 'bar', 'bam_zip_mep': 'mop',
'baz_fie': 'foo', 'bam_zip_zap': 'zup'}