如何计算这个递归函数?
首先,我需要迭代一个格式如下所示的字典:
{'style':'link',
'size':'large',
'parameters':{'id':'532',
'section':'55'},
'raw':'',
'contains':{'style':'link',
'size':'large',
'parameters':{'id':'55',
'section':'32'},
'raw':'',
'contains':{...}
}
}
此模式一直持续到 contains 字段中的空字典{}
为止。
这是我玩过的递归函数:
def recursive(n):
if 'contains' in [i.lower() for i in n.keys()]:
val += recursive(n['contains'])
else:
return TagBuilder().buildTag(n)
buildTag函数根据字典中提供的信息构建一个简单的HTML标记。
这是buildTag函数:
def buildTag(self, _tag_dict):
if isinstance(_tag_dict, dict):
if set(self._valid_tag) == set(_tag_dict.keys()):
return '<{0} {1}>{2}{3}</{0}>'.format(_tag_dict['style'],
self.parseAttribs(_tag_dict['parameters']), _tag_dict['contains'], _tag_dict['section'])
else:
return ''
else:
self.log.error('TypeError: invalid _tag_dict (%s), required (dict)' % type(_tag_dict).__name__)
raise TypeError('invalid _tag_dict (%s), required (dict)' % type(_tag_dict).__name__)
我需要做的是传递上面的字典,并按照它们嵌套在字典中的顺序创建一组嵌套的HTML标记。 例如:
<tag_contains0><tag_contains1><tag_contains...></tag_contains...></tag_contains1</tag_contains0>
答案 0 :(得分:1)
您可以保留列表而不是递归。当您遇到需要进入的内容时,可以将该项添加到列表中。
这些方面的东西:
def not_recursive(n):
val = ""
unhandled_list = [n]
while len(unhandled_list) > 0:
# get the item to handle
node = unhandled_list.pop(0)
try:
unhandled_list.append(node['contains'])
except KeyError:
val += TagBuilder().buildTag(n)
return val
请注意,上面的代码不是为了简单而不区分大小写(您必须单独处理)。此外,它假定node['contains']
是新节点,而不是节点列表。这不是树而是链......(这可能是原始代码中的错误,如果它实际上是节点列表,那么只需使用extend
而不是append
。)< / p>
也可能是您要将标记字符串添加到val
,无论节点是否有子节点。如果是这种情况,请从执行处理中取出val += ...
行。 (将其替换为pass
并取消val += ...
行。)