【问题标题】:Using recursion to put a nested structure into a dictionary without losing the structure使用递归将嵌套结构放入字典而不丢失结构
【发布时间】:2012-03-22 16:53:51
【问题描述】:

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

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

我到目前为止的代码只有在第一个元素有嵌套元素并且嵌套元素中没有另一个嵌套元素时才有效。这是代码:

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'}

【问题讨论】:

  • &lt;Element 'scan' at 0xwhatever&gt; 是有效的可散列类型吗?我觉得 python 不会让你用它作为键。
  • 您在使用 xml 吗?您想通过这样做解决什么大问题?
  • 是的,我正在使用 xml,我想在不读取整个 xml 文件的情况下获取 xml 树的一个分支中的所有嵌套元素。
  • @NiekdeKlein:如果你不阅读整个文件,你怎么知道你有所有嵌套元素?

标签: python recursion dictionary


【解决方案1】:

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

您可能想查看InternalCfg.py 文件:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这真的很奇怪,我确定我的函数被称为 getALlNestedElementInformation 因为我直接从我的代码中复制了它......嗯,把它改回我的代码
    • 它从一开始就运行,我只是想在字典中增加一个我不知道如何添加的“层”。
    • @NiekdeKlein 这意味着你的代码运行不正确。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 2011-10-23
      • 1970-01-01
      • 2022-10-15
      相关资源
      最近更新 更多