Python фильтр вложенного dict со значением ключа и печать части - PullRequest
0 голосов
/ 17 марта 2020

Допустим, у меня есть вложенная 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, но я не знаю, как мне добиться фильтрации значений, где я печатаю Вся часть, где заголовок совпадает.

Ответы [ 3 ]

1 голос
/ 17 марта 2020

Ниже приведено общее решение, не предполагающее структуру переданного объекта, который может быть списком, словарем и т. Д. c. Он будет рекурсивно спускаться через структуру, ища словарь с ключом "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 Демо

0 голосов
/ 17 марта 2020

Я нашел более простое решение, как описано выше. Понимание списка намного проще

[problem for problem in problem['problems'] if problem['name'].find("aspirin")!=1]
0 голосов
/ 17 марта 2020

Вы можете попробовать это ниже:

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