Python筛选带有键值的嵌套dict并打印部件

Python筛选带有键值的嵌套dict并打印部件,python,dictionary,Python,Dictionary,假设我有一个嵌套的dict,像这样,但要长得多: { "problems": [{ "1":[{ "name":"asprin abc", "dose":"", "strength":"100 mg" }], "2":[{

假设我有一个嵌套的
dict
,像这样,但要长得多:

    {
"problems": [{
                "1":[{
                        "name":"asprin abc",
                        "dose":"",
                        "strength":"100 mg"
                    }],


                "2":[{

                        "name":"somethingElse",
                        "dose":"",
                        "strenght":"51g"

                    }],
                "3":[{

                        "name":"againSomethingElse",
                        "dose":"",
                        "strenght":"511g"

                    }],           
        }],
        "labs":[{
            "missing_field": "missing_value"
        }]
    }
现在我想遍历
dict
并进行一些过滤。我只想让键
“name”
的部分
类似于“%aspirin%”
,就像在
Transact-SQL
中一样

因此,输出应如下所示:

[{
  "name":"asprin abc",
  "dose":"",
  "strength":"100 mg"
}]

我现在知道如何迭代dict
dict
,但我不知道如何实现值过滤,在这里我打印标题匹配的整个部分

您可以尝试以下方法:

for p_obj in json_data["problems"]:
    for i in p_obj.keys():
        for j in p_obj[i]:
            if "asprin" in j["name"]:
                output.append(j)
print(output)

我找到了如上所述的更简单的解决方案。列表理解要容易得多

[problem for problem in problem['problems'] if problem['name'].find("aspirin")!=1]

以下是一个通用解决方案,它不假设传递对象的结构,可以是列表、字典等。它将递归地遍历结构,查找具有键
“name”
的字典,该键的值包含
asprin
,并将
生成该字典:

d = {
"problems": [{
                "1":[{
                        "name":"asprin abc",
                        "dose":"",
                        "strength":"100 mg"
                    }],


                "2":[{

                        "name":"somethingElse",
                        "dose":"",
                        "strenght":"51g"

                    }],
                "3":[{

                        "name":"againSomethingElse",
                        "dose":"",
                        "strenght":"511g"

                    }],
        }],
        "labs":[{
            "missing_field": "missing_value"
        }]
    }

def filter(obj):
    if isinstance(obj, list):
        for item in obj:
            yield from filter(item)
    elif isinstance(obj, dict):
        if "name" in obj and "asprin" in obj["name"]:
            yield obj
        else:
            for v in obj.values():
                if isinstance(v, (list, dict)):
                    yield from filter(v)

print(list(filter(d)))
印刷品:

[{'name': 'asprin abc', 'dose': '', 'strength': '100 mg'}]

我跟不上。我假定您假定
dict
的名称是
问题
。但是
problem[
problems
]没有名为
name`的键。是你干的吗?你能把所有代码都显示出来吗?谢谢。当
中的
可以使用时,不要使用
str.find()