如何算出这个递归函数?
首先,我需要迭代一个格式如下所示的字典:
{'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>
你可以用列表代替递归。当你遇到需要深入了解的内容时,你可以将其添加到列表中。
下面的内容:
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']
是一个新节点,而不是一个节点列表。这不是一棵树,而是一条链子……(这可能是原始代码中的一个bug,如果它实际上是一个节点列表,那么只需使用extend
而不是append
。)
也可能是您想要将标记字符串添加到val
,而不管节点是否有子节点。如果是这种情况,将val += ...
行从异常处理中移除。(将其替换为pass
并取消val += ...
行缩进)