递归函数问题

2024-10-04 09:27:37 发布

您现在位置:Python中文网/ 问答频道 /正文

怎么了

我有一个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
                    }
                ]
            }
        ]
    }
]
}

我希望有这样的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结构是可变的,因此我不知道有多少层和子层会有我的对象。然而,我知道我想要返回的等级有一个关键的“媒介”,有一系列的媒介和完整的路径。所以,我认为更好的解决方案是递归函数,但我在这个问题上花了几个小时,什么都没有得到

有没有人有这样的想法或更好的方法


Tags: pathjsonfalsemediumplatformschildrenmediumssubpath2
1条回答
网友
1楼 · 发布于 2024-10-04 09:27:37

可以对生成器使用递归:

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

相关问题 更多 >