【发布时间】:2016-08-16 22:28:54
【问题描述】:
我最近不得不使用嵌套的 dict/list 组合解决实际数据系统中的一个问题。我为此工作了很长时间,并想出了一个解决方案,但我很不满意。我不得不求助于使用globals() 和一个命名的临时全局参数。
我不喜欢使用全局变量。那只是要求一个注入漏洞。我觉得必须有更好的方法来执行这项任务,而无需求助于全局变量。
问题数据集:
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'])
我将如何构建更好的解决方案?
【问题讨论】:
-
感谢大家的解决方案!你的许多解决方案都比我的好。我的限制是我需要它可重用于许多不同的数据结构和类型。我收到的数据转储包含这种情况的几个变体,我需要能够解决所有这些问题。
-
我不明白你为什么需要这些副本?
标签: python list dictionary recursion global