Проблемы с рекурсивной функцией - PullRequest
1 голос
/ 08 апреля 2020

что случилось?

У меня есть json файл, подобный этому:

{
"path": "path",
"children": [
    {   "path": "path/subPath1",
        "children": [
        {
            "path": "path/subPath1/subSubPath1",
            "mediums": [
                {
                    "medium": "midia1",
                    "platforms": [
                        1
                    ],
                    "platformsInfo": [
                        {
                            "platformId": 1,
                            "elegible": true
                        }
                    ]
                }
            ]
        },
        {
            "path": "path/subPath1/subSubPath2",
            "mediums": [
                {
                    "medium": "midia2",
                    "platforms": [
                        2
                    ],
                    "platformsInfo": [
                        {
                            "platformId": 2,
                            "elegible": false
                        }
                    ]
                }
            ]
        },
        {
            "path": "path/subPath1/subSubPath3",
            "mediums": [
                {
                    "medium": "midia3",
                    "platforms": [
                        3
                    ],
                    "platformsInfo": [
                        {
                            "platformId": 3,
                            "elegible": false
                        }
                    ]
                }
            ]
        }
        ]
    },
    {
        "path": "path/subPath2",
        "mediums": [
            {
                "medium": "midia4",
                "platforms": [
                    4
                ],
                "platformsInfo": [
                    {
                        "platformId": 4,
                        "elegible": false
                    }
                ]
            }
        ]
    }
]
}

И я буду sh pd.DataFrame, как это:

Path                                Medium          IdPlatform      Eligible
path/subPath1/subSubPath1           medium1         1               True
path/subPath1/subSubPath2           medium2         2               False
path/subPath1/subSubPath3           medium3         3               False
path/subPath2                       medium4         4               True

Эта json структура изменчива, поэтому я не знаю, сколько уровней и подуровней будет иметь мой объект. Тем не менее, я знаю, что уровень, который я хочу вернуть, имеет ключевые «медиумы» с массивом медиумов и полным путем. Итак, я думаю, что лучшее решение - это рекурсивная функция, но я потратил пару часов на эту проблему и ничего не смог получить.

У кого-нибудь есть идеи или лучший способ сделать это?

1 Ответ

0 голосов
/ 08 апреля 2020

Вы можете использовать рекурсию с генератором:

targets = ['path', 'medium', 'platformId', 'elegible']
def get_vals(d, k = {}):
  if isinstance(d, list):
     for i in filter(lambda x:isinstance(x, (dict, list)), d):
        yield from get_vals(i, k)
  else:
     k, flag = {**k, **{i:d.get(i) for i in targets if i in d}}, False
     for b in d.values():
        if isinstance(b, (list, dict)):
          flag = True
          yield from get_vals(b, k)
     if not flag:
        yield k

import pandas as pd
df = pd.DataFrame(list(get_vals(your_data)))

Выход:

                        path  medium  platformId  elegible
0  path/subPath1/subSubPath1  midia1           1      True
1  path/subPath1/subSubPath2  midia2           2     False
2  path/subPath1/subSubPath3  midia3           3     False
3              path/subPath2  midia4           4     False
...