我认为您太过复杂了。您从具有键和值的字典开始。它的值可以是要递归的字典或词典列表,也可以不是,在这种情况下,请不要理会。所以:
def flatten(d):
out = {}
for key, val in d.items():
if isinstance(val, dict):
val = [val]
if isinstance(val, list):
for subdict in val:
deeper = flatten(subdict).items()
out.update({key + '_' + key2: val2 for key2, val2 in deeper})
else:
out[key] = val
return out
给我
In [34]: nested = {'a': 1, 'b': 2, 'c': {'c1': [{'c11': 1, 'c12': 2, 'c13': 3}, {'c21': 1, 'c22': 2, 'c23': 3}], 'd1': [{'d11': 1, 'd12': 2, 'd13': 3}, {'d21': 1, 'd22': 2, 'd23': 3}]}, 'x': 1, 'y': 2}
In [35]: flatten(nested)
Out[35]:
{'a': 1,
'b': 2,
'c_c1_c11': 1,
'c_c1_c12': 2,
'c_c1_c13': 3,
'c_c1_c21': 1,
'c_c1_c22': 2,
'c_c1_c23': 3,
'c_d1_d11': 1,
'c_d1_d12': 2,
'c_d1_d13': 3,
'c_d1_d21': 1,
'c_d1_d22': 2,
'c_d1_d23': 3,
'x': 1,
'y': 2}