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

时间:2012-03-22 16:53:51

标签: python recursion dictionary

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

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

到目前为止,我所使用的代码只有在第一个元素具有嵌套元素且嵌套元素中没有其他嵌套元素时才有效。这是代码:

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)

我想要

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

但我没有超越

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

因为我不知道如何映射'nestedElement'字典中的下一个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'}

3 个答案:

答案 0 :(得分:2)

在我编写的工具的配置中,查看数据的组织方式。

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

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

还有一些其他(辅助)函数 - 比如append_list()为列表添加值。

答案 1 :(得分:0)

您的代码没有递归调用。这就是为什么你只能降到一个级别。

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

答案 2 :(得分:0)

必须在字典中保存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