基于键和值的嵌套dict的条件递归搜索

时间:2019-04-11 17:15:24

标签: python dictionary nested

就SQL而言,我试图基于查询中使用的表构建依赖关系图。我设法根据子查询的嵌套程度将它们解析为一个嵌套字典,其深度取决于嵌套查询的每个块,并且子查询可能有所不同。给出以下示例:

sql = {"select":{"value":"some value"},
       "from":[{"value":"table1","name":"a"},
               {"value":{"select":{"value":"*"},
                         "from":{"value":"table2","name":"b"}}}]}

预期输出为:

["table1","table2"]

我最初的方法是使用以下命令递归搜索from键:

def recurd(d, find = ['from']):
    if isinstance(d, list):
        for i in d:
            yield from recurd(i)
    elif isinstance(d, dict):
        for k,v in d.items():
            if any(i in k for i in find):
                yield v
        for j in d.values():
            yield from recurd(j)

输出:

[{'value': 'table1', 'name': 'a'}, {'value': {'select': {'value': '*'}, 'from': {'value': 'table2', 'name': 'b'}}}]
{'value': 'table2', 'name': 'b'}

虽然这是预期的,但我发现基于键和值递归地返回我想要的值也很令人困惑。我曾尝试环顾四周,但似乎大多数应用于嵌套字典的递归示例都只看键,类似于上面的示例。

1 个答案:

答案 0 :(得分:1)

函数在递归时应跟踪父键,以便仅当父键为myTree->setStyleSheet("border: 1px solid green; background: green;"); 时才可以产生值:

'from'

使def get_tables(d, find=('from',), parent_key=None): if isinstance(d, dict): if parent_key in find and isinstance(d.get('value'), str): yield d['value'] for k, v in d.items(): yield from get_tables(v, find, k) elif isinstance(d, list): for i in d: yield from get_tables(i, find, parent_key) 返回:

list(get_tables(sql))