Создание словаря с использованием рекурсии в Python

хорошо, потратив слишком много времени, пытаясь придумать способ создания словаря с использованием рекурсии, я думаю, что понял, что не могу придумать, как это сделать. Я новичок в рекурсии, но считаю, что это лучший способ работы с деревьями и словарями. Ниже приведен пример структуры, которую я пытаюсь создать, и она получена из файла SVG (парсер XML с использованием python) ссылка на svg Это пример синтаксического анализатора SVG xml, который я использую в python:

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 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 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 
                    "other_rectangle":{
                    "height": "5.1593742",
                    "type": "rectangle",
                    "paint": "#00000",
                     },
                    "mypath":{
                      "d": "m 200.68604,100.33686 1.42273,0.007",
                      "type": "path",
                      "paint" "#fffff"
                     }
                  },
                    "name": "myinnerlayer",
                    "transform": "translate(-13.956264)",
                    "type": "g"  // g stands for group
                    ],
                    "myrectangle":{
                    "height": "5.1593742",
                    "type": "rectangle",
                    "paint": "#00000",
                   }
                },
              "name": "layer1",
              "transform": "translate(-13.956264)",
              "type": "g"  // g stands for group
              ]
            }
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите воссоздать структуру xml в виде файла dict. Я бы рекомендовал хранить тег и атрибуты в виде пар ключ/значение и делать то же самое рекурсивно для всех дочерних элементов во вложенном списке:

import xml.etree.ElementTree as ET
import json

path_to_svg = "g2273.svg"
tree = ET.parse(path_to_svg)
root = tree.getroot()           # Getting Root element of the SVG XML

def get_dict_from_elts(elt):
    d = {'tag': elt.tag}
    d.update(elt.attrib)
    items = [get_dict_from_elts(item) for item in elt]
    if items:
        d['items'] = items 
    return d

print(json.dumps(get_dict_from_elts(root), indent=4))

Вывод для предоставленного вами svg:

{
    "tag": "{http://www.w3.org/2000/svg}svg",
    "width": "86.657898",
    "height": "76.455795",
    "viewBox": "0 0 22.928236 20.228928",
    "version": "1.1",
    "id": "svg5",
    "items": [
        {
            "tag": "{http://www.w3.org/2000/svg}defs",
            "id": "defs2"
        },
        {
            "tag": "{http://www.w3.org/2000/svg}g",
            "id": "layer1",
            "transform": "translate(-227.12752,-41.445548)",
            "items": [
                {
                    "tag": "{http://www.w3.org/2000/svg}rect",
                    "style": "fill:#333333;fill-opacity:1;stroke:#000000;stroke-width:0.499996;stroke-linejoin:round",
                    "id": "rect908",
                    "width": "508",
                    "height": "219.7191",
                    "x": "0",
                    "y": "0"
                },
                {
                    "tag": "{http://www.w3.org/2000/svg}g",
                    "id": "g2273",
                    "transform": "translate(93.701594,36.124183)",
                    "style": "fill:#ffffff",
                    "items": [
                        {
                            "tag": "{http://www.w3.org/2000/svg}rect",
                            "style": "fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1",                            "id": "ConveyanceStandardBlock-55-1-7",
                            "width": "10.451043",
                            "height": "5.1593747",
                            "x": "145.65312",
                            "y": "19.84375",
                            "items": [
                                {
                                    "tag": "{http://www.w3.org/2000/svg}title",
                                    "id": "title869-1-9-8"
                                }
                            ]
                        },
                        {
                            "tag": "{http://www.w3.org/2000/svg}rect",
                            "style": "fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1",                            "id": "ConveyanceStandardBlock-55-1-7-5",
                            "width": "10.451043",
                            "height": "5.1593747",
                            "x": "145.65312",
                            "y": "6.2176895",
                            "items": [
                                {
                                    "tag": "{http://www.w3.org/2000/svg}title",
                                    "id": "title869-1-9-8-2"
                                }
                            ]
                        },
                        {
                            "tag": "{http://www.w3.org/2000/svg}g",
                            "id": "layer1-7-7-4",
                            "transform": "matrix(0.36588023,0,0,0.36535713,133.67611,5.571187)",
                            "style": "fill:#ffffff;stroke-width:1.36755;stroke-miterlimit:4;stroke-dasharray:none",
                            "items": [
                                {
                                    "tag": "{http://www.w3.org/2000/svg}circle",
                                    "style": "fill:#ffffff;stroke:#000000;stroke-width:1.36755;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1",      
                                    "id": "SpiralBase-0-9",
                                    "cx": "27",
                                    "cy": "27",
                                    "r": "27"
                                },
                                {
                                    "tag": "{http://www.w3.org/2000/svg}circle",
                                    "style": "fill:#ffffff;stroke:#000000;stroke-width:1.36755;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1",      
                                    "id": "CircleOutline-5-1",
                                    "cx": "27",
                                    "cy": "27",
                                    "r": "20"
                                },
                                {
                                    "tag": "{http://www.w3.org/2000/svg}circle",
                                    "style": "fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.36755;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1",
                                    "id": "Circle3-1-3",
                                    "cx": "27",
                                    "cy": "27",
                                    "r": "10"
                                },
                                {
                                    "tag": "{http://www.w3.org/2000/svg}path",
                                    "style": "fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.36755;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1",
                                    "d": "m 20.486961,32.275903 6.477822,-10.421566 6.54677,10.421566 h -6.512296 z",
                                    "id": "SpiralDirection-0-4"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

Я даже не знал, что это возможно. Я так многому могу научиться!

Ignacio Castaneda 21.02.2023 17:31

Я проверил это, и это прекрасно. Это именно то, что мне нужно. Я ценю!

Ignacio Castaneda 21.02.2023 17:44

Другие вопросы по теме