簡體   English   中英

Python過濾帶有鍵值的嵌套字典並打印一部分

[英]Python filter nested dict with key value and print a part

假設我有一個這樣的嵌套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"LIKE '%aspirin% ,就像在Transact-SQL

所以輸出應該如下:

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

我現在如何遍歷dict但我不知道我應該如何實現值過濾,在那里我打印標題匹配的整個部分。

以下是對傳遞對象的結構不做任何假設的通用解決方案,它可以是列表、字典等。它將遞歸地向下遍歷結構查找具有鍵"name"的字典,其值包含asprin並且將yield那本字典:

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'}]

Python 演示

你可以在下面試試這個:

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM