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这意味着你的代码运行不正确。