Python字典递归

时间:2014-07-22 14:18:49

标签: python html recursion dictionary

如何计算这个递归函数?

首先,我需要迭代一个格式如下所示的字典:

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

1 个答案:

答案 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 += ...行。)

相关问题