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