在 Python 中使用递归创建字典

问题描述 投票:0回答:0

ok,在花了太多时间试图想出一种使用递归创建字典的方法之后,我想我已经意识到我想不出一种方法来做这件事。我是递归的新手,但我相信这是处理树和字典的最佳方式。下面是我试图创建的结构示例,这是从 SVG 文件(使用 python 的 XML 解析器)获得的 链接到 svg 这是我在 python 中使用的 SVG xml 解析器的示例:

import xml.etree.ElementTree as ET
path_to_svg = "/images/test/mysvg.svg"
tree = ET.parse(path_to_svg)
root = tree.getroot()           # Getting Root element of the SVG XML
first_layer = root[1]

其中 firs_layer 表示 SVG 文件中的主层。目标是能够根据 SVG 结构识别组及其子项。 理想情况下,它类似于:

            {
              "items": [
                {
                  "someattribute": {
                    "": "#ffffff",
                    "rule": "evenodd"
                  },
                  "height": "5.1593742",
                  "name": "myunit",
                  "type": "rectangle",
                }
              ],
              "name": "layer1",
              "transform": "translate(-13.956264)",
              "type": "g"  // g stands for group
            }

我真正想要实现的是树结构,能够基于SVG结构按层次分组项目,我觉得我在这上面花了太多时间,我想不通。我会很感激一些帮助。谢谢!

def recursiveTree(items, pre=None) -> dict:
    # pre = pre if pre else {}
    # pre = pre[:] if pre else []
    print("i made it here")
    if len(element) <=1 and element.tag != 'title':
        
        return element
    else:
        for item in items:
            # temp = None
            # group = None
            if formatstr(item.tag) == 'g':
                print('made it here')
                group = {"items": [recursiveTree(item, pre)], "name": item.attrib['id'], "transform": item.attrib['transform'],
                        "type":"group"}
                return group
            elif formatstr(element.tag) != 'g':
                if formatstr(element.tag == "path"):
                    stroke, fill = styleParser(style_ie)
                    temp = {'d': element.attrib['d'], 'fill':fill,'name': element.attrib['id'], 'stroke': stroke,
                            'style':{},
                            'type': 'path'}
                    return temp
            else:
                return item
    
print(recursiveTree(root[1]))

这是我尝试过的示例,但我知道这不是返回我需要的结构的正确方法。 这是预期的输出:

但如果该组有嵌套组,结构将类似于:

            {
              "items": [
                {
                 "items": [
                  {
                      // This is a group inside a group 
                    "rectangle":{
                    "height": "5.1593742",
                    "name": "myunit",
                    "paint": "#00000",
                     },
                    "path":{
                      "d": "m 200.68604,100.33686 1.42273,0.007",
                      "name": "mypath",
                      "paint" "#fffff"
                     }
                  }],
                    "rectangle":{
                    "height": "5.1593742",
                    "name": "myunit",
                    "paint": "#00000",
                   }
                }
              ],
              "name": "layer1",
              "transform": "translate(-13.956264)",
              "type": "g"  // g stands for group
            }
python dictionary recursion svg hierarchy
© www.soinside.com 2019 - 2024. All rights reserved.