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()