检查嵌套字典的每一层是否有两个特定的键并返回键值对

Se *_* Ko 1 python dictionary

我已经尝试了多种方法,但不幸的是没有得到任何有用的结果。我有以下问题:我有一个非常深且任意的嵌套字典。

d = {
    "aaa":{
        "bbb":"xyz",
        "ccc":{
            "description":"xyz",
            "data":"abc"
        },
        "description":"xyz"
    },
    "xxx":{
        "description":"xyz",
        "bbb":{
            "ccc":{
                "ddd":{
                    "description":"xyz"
                },
                "aaa":{
                    "description":{
                        "hhh": "xyz"
                    }
                },
                "zzz":{
                    "description":"xyz"
                }
            }
        }
    },
    "lll":{
        "description":"xyz",
        "bbb":{
            "ccc":{
                "hhh":{
                    "description":"xyz"
                },
                "ooo":{
                    "description":"xyz",
                    "aaa":{
                        "ddd":{
                            "description":"xyz"
                        }
                    },
                    "zzz":{
                        "ddd":{
                            "description":"xyz"
                        }
                    }
                },
                "zzz":{
                    "description":"xyz"
                }
            }
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

现在我想搜索字典的所有级别并检查键“aaa”和“zzz”是否出现在该级别中。如果是这种情况,我想在带有元组的列表中输出键以及相应的值。

[('aaa:  {'ddd':{'description':'xyz'}', 'zzz:  {'description':'xyz'}'),
('aaa:{'ddd':{'description':'xyz'}}', 'zzz:{'description':'xyz'})
]
Run Code Online (Sandbox Code Playgroud)

我知道与

d.keys() 
Run Code Online (Sandbox Code Playgroud)

可以在一层打印所有按键。

我知道通过这个函数我可以遍历字典中的所有键和值

def recursive_items(dictionary):
    for key, value in dictionary.items():
        if type(value) is dict:
            yield from recursive_items(value)
        else:
            yield (key, value)
Run Code Online (Sandbox Code Playgroud)

但是,我在链接两者并将输出放入元组列表中时遇到问题。

And*_*ely 6

尝试(d是你问题中的字典):

def find(d, keys=("aaa", "zzz")):
    if isinstance(d, dict):
        if all(k in d for k in keys):
            yield tuple((k, d[k]) for k in keys)
        for v in d.values():
            yield from find(v, keys)
    elif isinstance(d, list):
        for v in d:
            yield from find(v, keys)


print(list(find(d)))
Run Code Online (Sandbox Code Playgroud)

印刷:

[
    (
        ("aaa", {"description": {"hhh": "xyz"}}), 
        ("zzz", {"description": "xyz"})),
    (
        ("aaa", {"ddd": {"description": "xyz"}}),
        ("zzz", {"ddd": {"description": "xyz"}}),
    ),
]

Run Code Online (Sandbox Code Playgroud)