Выполните итерацию по вложенному объекту словаря и получите значение указанного c объекта в Python - PullRequest
1 голос
/ 24 марта 2020

Я хочу получить значение всех ObjectId из этого словаря, который является комбинацией списка и словаря. Требуемый ответ мне -> 2, 2, [["Значение равно 1"], ""], 3, 2

Мое решение получить ObjectId. Это только давало мне значение внутреннего ObjectId. Хотите получить значения всех ObjectId, будь то значение int или list et c.

for key in dictObj:
    if key == "RESULT":
        if (type(dictObj[key])== list):
            for list in dictObj[key]:
                for key,value in list.items():
                    while(True):
                        if (type(value)==dict) and value:
                            for key1,value1 in value.items():
                                value = value1
                                key = key1
                        elif (key=="ObjectId"):
                            print(value)
                            break
                        else:
                            break

Словарь объекта равен

dictObj =  {
            "Id": 1,
            "RESULT": [
                {
                    "Check": {
                        "checkinstance": {
                            "ObjectId": 2,
                            "Class": "Base"
                        }
                    },
                    "Class": "Base"
                },
                {
                    "ObjectId": 2,
                    "Class": "Base",
                    "Start": {}
                },
                {
                    "Display": {
                        "part": {
                            "Class": "Base",
                            "ObjectId": [
                                [
                                    "Value is 1"
                                ],
                                ""
                            ]
                        },
                        "load": {
                            "ObjectId": 3,
                            "Class": "Base"
                        }
                    },
                    "Class": "Base"
                },
                {
                    "ObjectId": 2,
                    "Class": "Base",
                    "Stop": {}
                }
            ]
        }

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Этот код не предполагает структуру входного объекта, obj (это может быть словарь или список):

obj   = {
            "Id": 1,
            "RESULT": [
                {
                    "Check": {
                        "checkinstance": {
                            "ObjectId": 2,
                            "Class": "Base"
                        }
                    },
                    "Class": "Base"
                },
                {
                    "ObjectId": 2,
                    "Class": "Base",
                    "Start": {}
                },
                {
                    "Display": {
                        "part": {
                            "Class": "Base",
                            "ObjectId": [
                                [
                                    "Value is 1"
                                ],
                                ""
                            ]
                        },
                        "load": {
                            "ObjectId": 3,
                            "Class": "Base"
                        }
                    },
                    "Class": "Base"
                },
                {
                    "ObjectId": 2,
                    "Class": "Base",
                    "Stop": {}
                }
            ]
        }

def filter(obj):
    if isinstance(obj, list):
        for item in obj:
            filter(item)
    elif isinstance(obj, dict):
        if "ObjectId" in obj:
            print(obj["ObjectId"])
        for v in obj.values():
            if isinstance(v, (list, dict)):
                filter(v)

filter(obj)

Отпечатки:

2
2
[['Value is 1'], '']
3
2

Python Демо

Если вы не хотите печатать значения, а вместо этого накапливаете их в списке, то:

def filter2(obj):
    if isinstance(obj, list):
        for item in obj:
            yield from filter2(item)
    elif isinstance(obj, dict):
        if "ObjectId" in obj:
            yield obj["ObjectId"]
        for v in obj.values():
            if isinstance(v, (list, dict)):
                yield from filter2(v)

print(list(filter2(obj)))

Печать:

[2, 2, [['Value is 1'], ''], 3, 2]

Pyhon Demo

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

Вы можете иметь рекурсивную функцию, которая ищет все ключи в dict, а затем все ключи значений, которые также dict s:

# dictObj as in post

def findKey(key, d, result):
    for k,v in d.items():
        if k == key:
            result.append(v)
        if isinstance(v,dict):
            findKey(key, v, result)



result = []

for key in dictObj:
    if key == "RESULT":
        if (type(jsonObj[key])== list):
            for d in jsonObj[key]:
                findKey('ObjectId', d, result)

print(result)

Выход:

[2, 2, [[ "Value is 1"], ""], 3, 2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...