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

Python 使用递归将嵌套结构放入字典而不丢失该结构,python,recursion,dictionary,Python,Recursion,Dictionary,我有一个元素,它有项目和标记。元素可以包含更多的元素,这些元素也可以包含项和标记,这些元素也可以包含项和标记。之前我不知道第一个元素中有多少“嵌套”元素 我想用元素作为键将标记和项保存在字典中,如果元素具有“嵌套”元素,我想将该元素及其信息保存在与其“父元素”相同的字典条目中 到目前为止,只有当第一个元素有嵌套元素,而嵌套元素中没有其他嵌套元素时,我的代码才起作用。代码如下: def getAllNestedElementInformation(element, nestedDict=None)

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

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

到目前为止,只有当第一个元素有嵌套元素,而嵌套元素中没有其他嵌套元素时,我的代码才起作用。代码如下:

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”dict中的下一个nestedElement

为了举例说明我现在拥有什么以及我想要拥有什么,当我打印NestedICT时,我得到了:

{'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':{:{'tagName':'scan'}},'tagName':'spectrum','id':'1'}
{'index':'0','nestedElement':{:{'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'}
{'index':'0','nestedElement':{'tagName':'scan','nestedElement:{'name':'scan start time','unitName':'second','tagName':'cvParam',}},'tagName':'spectrum','id':'1}

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


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

看起来与我编写的工具配置中的数据组织方式完全相同

您可能希望查看该文件:

  • get\u value()
    返回一个值
  • 设置值()
    设置值

还有一些其他(帮助器)函数,比如
append\u list()
向列表中添加值。

必须将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 

是有效的哈希类型吗?我觉得python不允许您使用它作为密钥。您正在使用xml吗?通过这样做,您试图解决的大问题是什么?是的,我正在处理xml,我想在不读取整个xml文件的情况下获取xml树分支中的所有嵌套元素。@NiekdeKlein:如果您不读取整个文件,您怎么知道您拥有所有嵌套元素?这真的很奇怪,我确信我的函数名为getALlNestedElementInformation,因为我从代码中复制了它。。。啊,好吧,把它改回我的代码。它从一开始就运行,我只想在字典中增加一个我不知道如何添加的“层”。@NiekdeKlein这意味着你的代码运行不正确。