[英]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'}]
你可以在下面試試這個:
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.