迭代嵌套字典时查找父对象

时间:2019-03-06 15:48:13

标签: python python-3.x

我试图遍历一个嵌套的字典,该字典将列表作为值,并且该列表还可能包含另一个字典。我的字典看起来像这样:

{
    "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:andBOOLOP:and是父级,子级关系,而@BOOLOP:orFRAGMENT的子级子代。

目前,我的函数仅对它们进行迭代,但不提供父子关系。

我正在使用的功能是:

@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键进行计算。

0 个答案:

没有答案