2 回答
TA贡献1943条经验 获得超7个赞
您可以通过考虑到您的 dicts 值是字符串或具有其他 dicts 的列表来使用递归方法:
dict_flat = {'ID': '123',
'info': [{'breed':'collie'},
{'fur': [{'short':'no'},
{'color':[{'black':'no'},
{'brown':'yes'}]}]}]}
def my_flatten(dict_flat, key_prefix=None):
result = {}
for k, v in dict_flat.items():
key = f'{key_prefix}_{k}' if key_prefix is not None else k
if isinstance(v, list):
for d in v:
result.update(my_flatten(d, key))
else:
result[key] = v
return result
my_flatten(dict_flat)
输出:
{'ID': '123',
'info_breed': 'collie',
'info_fur_short': 'no',
'info_fur_color_black': 'no',
'info_fur_color_brown': 'yes'}
TA贡献1799条经验 获得超9个赞
另一种方法是创建一个生成键/值元组的生成器。您可以简单地将其传递给字典构造函数:
d = {'ID': '123',
'info': [{'breed':'collie'},
{'fur': [{'short':'no'},
{'color':[{'black':'no'},
{'brown':'yes'}]}]}]}
def flatten(obj, prefix=[]):
if isinstance(obj, str):
yield ('_'.join(prefix), obj)
elif isinstance(obj, list):
for o in obj:
yield from flatten(o, prefix)
else:
for k, v in obj.items():
yield from flatten(v, prefix + [k])
dict(flatten(d))
结果:
{'ID': '123',
'info_breed': 'collie',
'info_fur_short': 'no',
'info_fur_color_black': 'no',
'info_fur_color_brown': 'yes'}
这避免了在函数中管理字典,这取决于您对事物的喜好,可能更容易推理。
添加回答
举报