我试图遍历一个嵌套的字典,该字典将列表作为值,并且该列表还可能包含另一个字典。我的字典看起来像这样:
{
"PickMeterEquipment": [
"@BOOLOP : and",
"@SEQ : 0",
"@TYPE : 0",
"BOOLOP : [{'@BOOLOP': 'or', '@SEQ': '1', '@TYPE': '0', 'FRAGMENT': [{'@FUNC1': 'value', '@FUNC2': 'literal', '@NULLACTION': 'Fragment is false', '@OP': '=', '@PROP1': 'PB:SALES_TYPE', '@PROP2': 'PURCHASE', '@SEQ': '1', '@TYPE': '1'}, {'@FUNC1': 'value', '@FUNC2': 'literal', '@NULLACTION': 'Fragment is false', '@OP': '=', '@PROP1': 'PB:SALES_TYPE', '@PROP2': 'LEASE', '@SEQ': '2', '@TYPE': '1'}]}, {'@BOOLOP': 'or', '@SEQ': '2', '@TYPE': '0', 'FRAGMENT': {'@FUNC1': 'value', '@FUNC2': 'list', '@NULLACTION': 'Fragment is false', '@OP': 'in', '@PROP1': 'PB:PRICELIST', '@PROP2': 'LeaseAccountingContracts', '@SEQ': '1', '@TYPE': '1'}}, {'@BOOLOP': 'or', '@SEQ': '4', '@TYPE': '0', 'FRAGMENT': [{'@FUNC1': 'value', '@FUNC2': 'propval', '@NULLACTION': 'Fragment is false', '@OP': '=', '@PROP1': 'PICK_SKU1', '@PROP2': '._sku', '@SEQ': '1', '@TYPE': '1'}, {'@FUNC1': 'value', '@FUNC2': 'propval', '@NULLACTION': 'Fragment is false', '@OP': '=', '@PROP1': 'PICK_SKU10', '@PROP2': '._sku', '@SEQ': '2', '@TYPE': '1'}]}]"
],
"Pick when Rental WEB": [
"@BOOLOP : and",
"@SEQ : 0",
"@TYPE : 0",
"FRAGMENT : [{'@FUNC1': 'value', '@FUNC2': 'literal', '@NULLACTION': 'Fragment is false', '@OP': '=', '@PROP1': 'PB:SOURCE_SYSTEM', '@PROP2': 'WEB', '@SEQ': '1', '@TYPE': '1'}, {'@FUNC1': 'value', '@FUNC2': 'literal', '@NULLACTION': 'Fragment is false', '@OP': '=', '@PROP1': 'PB:SALES_TYPE', '@PROP2': 'RENT', '@SEQ': '2', '@TYPE': '1'}, {'@FUNC1': 'value', '@FUNC2': 'literal', '@NULLACTION': 'Fragment is false', '@OP': '=', '@PROP1': 'MeterSelected', '@PROP2': '1H00', '@SEQ': '3', '@TYPE': '1'}]"
],
"DefaultShipping": [
"@BOOLOP : and",
"@SEQ : 0",
"@TYPE : 0",
"BOOLOP : [{'@BOOLOP': 'or', '@SEQ': '1', '@TYPE': '0', 'FRAGMENT': [{'@FUNC1': 'value', '@FUNC2': 'propval', '@NULLACTION': 'Fragment is false', '@OP': '=', '@PROP1': 'DEFAULT_SKU1', '@PROP2': '_sku', '@SEQ': '1', '@TYPE': '1'}, {'@FUNC1': 'value', '@FUNC2': 'propval', '@NULLACTION': 'Fragment is false', '@OP': '=', '@PROP1': 'DEFAULT_SKU2', '@PROP2': '_sku', '@SEQ': '2', '@TYPE': '1'}, {'@FUNC1': 'value', '@FUNC2': 'propval', '@NULLACTION': 'Fragment is false', '@OP': '=', '@PROP1': 'DEFAULT_SKU3', '@PROP2': '_sku', '@SEQ': '3', '@TYPE': '1'}]}, {'@BOOLOP': 'and', '@SEQ': '3', '@TYPE': '0', 'FRAGMENT': [{'@FUNC1': 'value', '@FUNC2': 'literal', '@NULLACTION': 'Fragment is true', '@OP': '!=', '@PROP1': 'IsShipingSelected', '@PROP2': 'yes', '@SEQ': '1', '@TYPE': '1'}, {'@FUNC1': 'value', '@FUNC2': 'literal', '@NULLACTION': 'Fragment is true', '@OP': '!=', '@PROP1': 'IsShipingSelected', '@PROP2': 'no', '@SEQ': '2', '@TYPE': '1'}]}]",
{
"@FUNC1": "propval",
"@FUNC2": "literal",
"@NULLACTION": "Fragment is false",
"@OP": "=",
"@PROP1": "_amEntitled",
"@PROP2": "1",
"@SEQ": "2",
"@TYPE": "1"
}
]
}
我编写了一个函数来对其进行迭代,但是唯一的问题是它正在迭代并为我提供了我想要的所有键和值,但没有给我的父子关系。
例如,假设第一个键PickMeterEquipment
现在是我需要的@BOOLOP:and
,并且它具有另一个键BOOLOP
,该键已经列出了列表,现在还有另一个{{1} },它将是@BOOLOP:or
的子代,依此类推。
基本上,我认为@BOOLOP:and
,BOOLOP:and
是父级,子级关系,而@BOOLOP:or
是FRAGMENT
的子级子代。
目前,我的函数仅对它们进行迭代,但不提供父子关系。
我正在使用的功能是:
@BOOLOP
父级孩子的信息很重要,因为我需要def objwalk(obj, path=(), memo=None):
if memo is None:
memo = set()
iterator = None
if isinstance(obj, Mapping):
iterator = iteritems
elif isinstance(obj, (Sequence, Set)) and not isinstance(obj, string_types):
iterator = enumerate
if iterator:
if id(obj) not in memo:
memo.add(id(obj))
for path_component, value in iterator(obj):
for result in objwalk(value, path + (path_component,), memo):
yield result
memo.remove(id(obj))
else:
yield path, obj
and
才能通过or
键进行计算。