How to completely traverse a complex dictionary of unknown depth?

后端 未结 7 1964
深忆病人
深忆病人 2020-11-30 17:35

Importing from JSON can get very complex and nested structures. For example:

{u\'body\': [{u\'declarations\': [{u\'id\': {u\'name\': u\'i\',
            


        
7条回答
  •  暖寄归人
    2020-11-30 18:24

    You can use a recursive generator for converting your dictionary to flat lists.

    def dict_generator(indict, pre=None):
        pre = pre[:] if pre else []
        if isinstance(indict, dict):
            for key, value in indict.items():
                if isinstance(value, dict):
                    for d in dict_generator(value, pre + [key]):
                        yield d
                elif isinstance(value, list) or isinstance(value, tuple):
                    for v in value:
                        for d in dict_generator(v, pre + [key]):
                            yield d
                else:
                    yield pre + [key, value]
        else:
            yield pre + [indict]
    

    It returns

    [u'body', u'kind', u'var']
    [u'init', u'declarations', u'body', u'type', u'Literal']
    [u'init', u'declarations', u'body', u'value', 2]
    [u'declarations', u'body', u'type', u'VariableDeclarator']
    [u'id', u'declarations', u'body', u'type', u'Identifier']
    [u'id', u'declarations', u'body', u'name', u'i']
    [u'body', u'type', u'VariableDeclaration']
    [u'body', u'kind', u'var']
    [u'init', u'declarations', u'body', u'type', u'Literal']
    [u'init', u'declarations', u'body', u'value', 4]
    [u'declarations', u'body', u'type', u'VariableDeclarator']
    [u'id', u'declarations', u'body', u'type', u'Identifier']
    [u'id', u'declarations', u'body', u'name', u'j']
    [u'body', u'type', u'VariableDeclaration']
    [u'body', u'kind', u'var']
    [u'init', u'declarations', u'body', u'operator', u'*']
    [u'right', u'init', u'declarations', u'body', u'type', u'Identifier']
    [u'right', u'init', u'declarations', u'body', u'name', u'j']
    [u'init', u'declarations', u'body', u'type', u'BinaryExpression']
    [u'left', u'init', u'declarations', u'body', u'type', u'Identifier']
    [u'left', u'init', u'declarations', u'body', u'name', u'i']
    [u'declarations', u'body', u'type', u'VariableDeclarator']
    [u'id', u'declarations', u'body', u'type', u'Identifier']
    [u'id', u'declarations', u'body', u'name', u'answer']
    [u'body', u'type', u'VariableDeclaration']
    [u'type', u'Program']
    

    UPDATE: Fixed keys list from [key] + pre to pre + [key] as mentioned in comments.

提交回复
热议问题