gpt4 book ai didi

python - 基于键和值的嵌套字典的条件递归搜索

转载 作者:行者123 更新时间:2023-12-01 08:03:23 25 4
gpt4 key购买 nike

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

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'}

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

最佳答案

该函数应在递归时跟踪父键,以便仅当父键为 '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)) 返回:

['table1', 'table2']

关于python - 基于键和值的嵌套字典的条件递归搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55637965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com