gpt4 book ai didi

使用嵌套键的 Python 递归搜索 Dict

转载 作者:太空狗 更新时间:2023-10-29 22:02:12 25 4
gpt4 key购买 nike

我最近不得不用嵌套的字典/列表组合解决真实数据系统中的一个问题。我为此工作了一段时间并提出了解决方案,但我非常不满意。我不得不求助于使用 globals() 和一个命名的临时全局参数。

我不喜欢使用全局变量。那只是要求注入(inject)漏洞。我觉得必须有更好的方法来执行此任务而无需求助于全局变量。

问题数据集:

d = {
"k":1,
"stuff":"s1",
"l":{"m":[
{
"k":2,
"stuff":"s2",
"l":None
},
{
"k":3,
"stuff":"s3",
"l":{"m":[
{
"k":4,
"stuff":"s4",
"l":None
},
{
"k":5,
"stuff":"s5",
"l":{"m":[
{
"k":6,
"stuff":"s6",
"l":None
},
]}
},
]}
},
]}
}

期望的输出:

[{'k': 1, 'stuff': 's1'},
{'k': 2, 'stuff': 's2'},
{'k': 3, 'stuff': 's3'},
{'k': 4, 'stuff': 's4'},
{'k': 5, 'stuff': 's5'},
{'k': 6, 'stuff': 's6'}]

我的解决方案:

def _get_recursive_results(d, iter_key, get_keys):
if not 'h' in globals():
global h
h = []
h.append({k:d.get(k) for k in get_keys})

d2 = d.copy()
for k in iter_key:
if not d2:
continue
d2 = d2.get(k)

for td in d2:
d3 = td.copy()
for k in iter_key:
if not d3:
continue
d3 = d3.get(k)

if d3:
return _get_recursive_results(td, iter_key, get_keys)
h.append({k:td.get(k) for k in get_keys})
else:
l = [k for k in h]
del globals()['h']
return l

按如下方式调用我的函数会返回所需的结果:

_get_recursively(d, ['l','m'], ['k','stuff'])

我如何构建更好的解决方案?

最佳答案

这是一个略微修改的版本,没有使用全局变量。将 h 设置为 None默认情况下,并为第一次调用 _get_recursive_results() 创建一个新列表。稍后提供 h 作为对 _get_recursive_results() 的递归调用的参数:

def _get_recursive_results(d, iter_key, get_keys, h=None):
if h is None:
h = []
h.append({k:d.get(k) for k in get_keys})
d2 = d.copy()
for k in iter_key:
if not d2:
continue
d2 = d2.get(k)
for td in d2:
d3 = td.copy()
for k in iter_key:
if not d3:
continue
d3 = d3.get(k)
if d3:
return _get_recursive_results(td, iter_key, get_keys, h)
h.append({k:td.get(k) for k in get_keys})
else:
l = [k for k in h]
return l

现在:

>>> _get_recursive_results(d, ['l','m'], ['k','stuff'])
[{'k': 1, 'stuff': 's1'},
{'k': 2, 'stuff': 's2'},
{'k': 3, 'stuff': 's3'},
{'k': 4, 'stuff': 's4'},
{'k': 5, 'stuff': 's5'},
{'k': 6, 'stuff': 's6'}]

不需要复制中间字典。这是没有复制的进一步修改版本:

def _get_recursive_results(d, iter_key, get_keys, h=None):
if h is None:
h = []
h.append({k: d.get(k) for k in get_keys})
for k in iter_key:
if not d:
continue
d = d.get(k)
for td in d:
d3 = td
for k in iter_key:
if not d3:
continue
d3 = d3.get(k)
if d3:
return _get_recursive_results(td, iter_key, get_keys, h)
h.append({k: td.get(k) for k in get_keys})
else:
return h

关于使用嵌套键的 Python 递归搜索 Dict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36808260/

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