递归到字典深度
Recursion into dictionary depth
试图解析来自某些程序的 xml-请求,我的架构非常复杂。它是字典的字典的字典。一些字典还包含字典列表。但是由于结构太不舒服,我的字典在整个深度中包含很多“垃圾”词 "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_']
但我需要对整个词典应用这种过滤器。
如评论中所述,如果可以解决 XML 解析过程中的问题,那将是更可取的。否则,我们可以使用带队列的非递归解决方案将文档的每个 inner/nested 元素入队并分别删除 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"
}
]
]
}
试图解析来自某些程序的 xml-请求,我的架构非常复杂。它是字典的字典的字典。一些字典还包含字典列表。但是由于结构太不舒服,我的字典在整个深度中包含很多“垃圾”词 "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_']
但我需要对整个词典应用这种过滤器。
如评论中所述,如果可以解决 XML 解析过程中的问题,那将是更可取的。否则,我们可以使用带队列的非递归解决方案将文档的每个 inner/nested 元素入队并分别删除 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"
}
]
]
}