Python字典递归



如何算出这个递归函数?

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

{'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 += ...行缩进)

最新更新