2 回答

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
您可以通過(guò)考慮到您的 dicts 值是字符串或具有其他 dicts 的列表來(lái)使用遞歸方法:
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貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊
另一種方法是創(chuàng)建一個(gè)生成鍵/值元組的生成器。您可以簡(jiǎn)單地將其傳遞給字典構(gòu)造函數(shù):
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))
結(jié)果:
{'ID': '123',
'info_breed': 'collie',
'info_fur_short': 'no',
'info_fur_color_black': 'no',
'info_fur_color_brown': 'yes'}
這避免了在函數(shù)中管理字典,這取決于您對(duì)事物的喜好,可能更容易推理。
添加回答
舉報(bào)