リストに無秩序な辞書を平坦化する方法は?

コードモンキー:

私は、抽出情報を容易にするために(順番にJSONファイルから取られたこと)無秩序な辞書を平らにしようとしました。以下は辞書が構成されている方法の例と、それを平坦化で私の試みです。

data = {'horse':{'speed':{"walk": 40, "run":50}}, 'dog':{'run':30}, 'human':{'gait':{'normal':{'run': 25, 'walk': 30}}}}

flat_dict = []
for items in list(data.items()):
    flat_list = []
    flat_list.append(items[0])
    try:
        for item in list(items[1].items())[0]:
            if type(item) is not dict: 
                flat_list.append(item)
            else:
                flat_list.append(list(item.keys())[0])
                flat_list.append(list(item.values())[0])
    except:
        flat_list.append(items[0])
    flat_dict.append(flat_list)

print(flat_dict)

しかし、上記のコードは辞書全体をフラット化しないと、一部の情報が失われ、ここで上記のコードの出力は次のとおりです。

[['horse', 'speed', 'walk', 40], ['dog', 'run', 30], ['human', 'gait', 'normal', {'run': 25, 'walk': 30}]]

私が望んでいたことでした。

[['horse', 'speed', 'walk', 40, 'run', 50], ['dog', 'run', 30], ['human', 'gait', 'normal', 'run', 25, 'walk', 30]]

私は何をしますか?

kederrac:

あなたはリスト内包して再帰的なアプローチを使用することができます。

 def gen(d):
    if isinstance(d, dict):
        for k, v in d.items():
            yield k
            yield from gen(v)
    else:
        yield d 

[[k, *gen(v)] for k, v in data.items()]

出力:

 [['horse', 'speed', 'walk', 40, 'run', 50],
 ['dog', 'run', 30],
 ['human', 'gait', 'normal', 'run', 25, 'walk', 30]]

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=32176&siteId=1