【问题标题】:Recursion into dictionary depth递归到字典深度
【发布时间】:2021-09-30 14:14:32
【问题描述】:

尝试从某个程序解析 xml-request 我有相当复杂的架构。它是 dict 的 dict 的 dict 的 dict。一些字典还包含字典列表。但是由于结构太不舒服,我的字典在其深度中包含很多“垃圾”词 "begin_""value"

例如:

<depart>
                                                                                                                                                                                                
    <BEGIN_>
                                                                                                                                                                                                               
        <id Value=""/>
                                                                                                                                                                                                                                       
        <code Value=""/>
                                                                                                                                                                                                               
        <name Value=""/>
                                                                                                                                                                                                                       
        <declNameList/>
                                                                                                                                                                                                
    </BEGIN_>
                                                                                                                                                                                 
</depart>

变成了

{'depart': {'BEGIN_': {'id': {'Value': ''},
             'code': {'Value': ''},
             'name': {'Value': ''},
             'declNameList': None}}}}}

我需要:

{'depart': {'id': '',
             'code': '',
             'name': '',
             'declNameList': None}}

您能帮我使用全深度递归删除这些垃圾吗? 目前我设法通过使用将h = {'status': {'BEGIN_': {'statusCode': {'Value': '0'}}}} 转换为{'status': {'statusCode': {'Value': '0'}}}

if 'Value' in h['status'].keys():
    h['status'] = h['status']['Value']
if 'BEGIN_' in h['status'].keys():
    h['status'] = h['status']['BEGIN_']

但我需要将这种过滤器应用于整个字典。

【问题讨论】:

  • 您要删除的具体内容是什么?你的预期输出是什么?或者你只是想flatten the dictionary
  • @NielGodfreyPonciano,我已经用示例更新了我的问题
  • 在您的第一个示例中,您如何进行从 XML 到字典的转换?当然,您需要做的就是修改该代码以(有效地)跳过 BEGIN_ 元素
  • 感谢您发布该链接。现在您知道需要修改哪些代码了。另请注意,当呈现在同一级别包含相同名称元素的 XML 数据时,该代码存在缺陷

标签: python dictionary parsing


【解决方案1】:

就像在 cmets 中一样,如果可以解决 XML 解析期间的问题,那将是更可取的。否则,我们可以使用带有队列的非递归解决方案将文档的每个内部/嵌套元素排入队列,并分别删除 BEGIN_Value

xml_dict = {
    'depart': {
        'BEGIN_': {
            'id1': {'Value': '11'},
            'code1': {'Value': '11'},
            'name1': {'Value': '11'},
            'declNameList1': None
        }
    },
    'BEGIN_': {
        "1": [
            {
                'id2': {'Value': '22'},
                'code2': {'Value': '22'},
                'name2': {'Value': '22'},
                'declNameList2': None
            },
            {
                'id3': {'Value': '33'},
                'code3': {'Value': '33'},
                'name3': {'Value': '33'},
                'declNameList3': None
            },
        ],
        "2": [
            {
                'id4': {'Value': '44'},
                'code4': {'Value': '44'},
                'name4': {'Value': '44'},
                'declNameList4': {
                    'code5': {'Value': '55'}
                },
            },
            {
                'id6': {'Value': '66'},
                'code6': {'Value': '66'},
                'name6': {'Value': '66'},
                'declNameList6': {
                    'code7': {
                        'BEGIN_': {
                            'name8': {'Value': '8'}
                        }
                    }
                },
            },
            {
                'any1': {'Value': '1'}
            },
            [
                {
                    "BEGIN_": {
                        'any2': {'Value': '2'}
                    },
                },
                {
                    "BEGIN_": {
                        'any3': {'Value': '3'}
                    },
                }
            ]
        ]
    }
}


queue = [xml_dict]

while queue:
    data = queue.pop()

    if isinstance(data, dict):
        if begin_value := data.pop("BEGIN_", None):
            data.update(begin_value)
            
        for key, value in data.items():
            if isinstance(value, dict) and value.keys() == {"Value"}:
                data[key] = value["Value"]
            elif isinstance(value, (dict, list)):
                queue.append(value)

    elif isinstance(data, list):
        for item in data:
            if isinstance(item, (dict, list)):
                queue.append(item)

print(xml_dict)

输出

{
    "depart": {
        "id1": "11",
        "code1": "11",
        "name1": "11",
        "declNameList1": None
    },
    "1": [
        {
            "id2": "22",
            "code2": "22",
            "name2": "22",
            "declNameList2": None
        },
        {
            "id3": "33",
            "code3": "33",
            "name3": "33",
            "declNameList3": None
        }
    ],
    "2": [
        {
            "id4": "44",
            "code4": "44",
            "name4": "44",
            "declNameList4": {
                "code5": "55"
            }
        },
        {
            "id6": "66",
            "code6": "66",
            "name6": "66",
            "declNameList6": {
                "code7": {
                    "name8": "8"
                }
            }
        },
        {
            "any1": "1"
        },
        [
            {
                "any2": "2"
            },
            {
                "any3": "3"
            }
        ]
    ]
}

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 2012-03-21
    • 2016-06-14
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2021-10-28
    • 2015-02-28
    相关资源
    最近更新 更多