使用递归将嵌套结构放入字典而不丢失结构

2024-09-28 15:37:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含项和标记的元素。元素可以包含更多元素,这些元素也有项和标记,这些元素也可以有项和标记。事先我不知道第一个元素中有多少“嵌套”元素。在

我想用元素作为键将标记和项保存在字典中,如果元素有“嵌套”元素,我希望将该元素及其信息保存在与“父元素”相同的字典条目中。在

到目前为止,我的代码只有在第一个元素有一个嵌套元素,而这个嵌套元素中没有其他嵌套元素的情况下才能工作。代码如下:

def getAllNestedElementInformation(element, nestedDict=None):
    infoDict = {'tagName':element.tag}
    infoDict.update(getItems(element))

    if nestedDict == None:
        nestedDict = infoDict
    else:
        nestedDict['nestedElement'][element] = infoDict
        print nestedDict

    for nestedElement in element:
        nestedDict.update({'nestedElement':collections.defaultdict(dict)})
        getAllNestedElementInformation(nestedElement, nestedDict=nestedDict)

我想要

^{pr2}$

但我不会比

{'name':'scan', 'nestedElement':{'name:'scanwindow'}}

因为我不知道如何映射“nestedElement”dict中的下一个nestedElement

举例说明我现在拥有什么和我想要什么,当我打印nestedDict时,我得到:

{'index': '0', 'nestedElement': {<Element 'scan' at 0x8068180>: {'tagName': 'scan'}}, 'tagName': 'spectrum', 'id': '1'}
{'index': '0', 'nestedElement': {<Element 'cvParam' at 0x80682a0>: {'name': 'scan start time', 'unitName': 'second', 'tagName': 'cvParam', }}, 'tagName': 'spectrum', 'id': '1'}

我想要:

{'index': '0', 'nestedElement': {<Element 'scan' at 0x8068180>: 'tagName': 'scan', 'nestedElement: {'name': 'scan start time', 'unitName': 'second', 'tagName': 'cvParam', }}, 'tagName': 'spectrum', 'id': '1'}

Tags: name标记id元素indexscanelementat
3条回答

您的代码没有递归调用。这就是为什么你只能下一级。在

您是否需要将getAllNestedElementInformation更改为getInfo(反之亦然)?在

必须在字典中保存getAllNestedElementInformation的返回值。如果有人想知道:这是我把代码改成的:

def getAllNestedElementInformation(element):
    infoDict = collections.defaultdict(dict)
    infoDict[element] = {'tagName':element.tag}
    infoDict[element].update(getItems(element))
    if element.text != None:
        if element.text.strip() != '':
            infoDict[element].update({'content':element.text})

    for nestedElement in element:
        infoDict[element]['nestedElement'] = getAllNestedElementInformation(nestedElement)  

    return infoDict 

在我编写的一个工具的配置中,数据的组织方式也完全相同。在

您可能需要查看InternalCfg.py文件:

  • get_value()返回一个值。在
  • set_value()设置一个值。在

还有一些其他(helper)函数,比如append_list()向列表添加值。在

相关问题 更多 >