遍历N个嵌套列表和字典

时间:2020-08-25 22:34:28

标签: python-3.x

我具有以下JSON / Dict结构。

plsetopt

]

我想遍历所有字典并在根列表内列出并为根列表内的每个字典创建单个字符串。

输出看起来像这样(两行):

[
{
    "childrens": [
        {
            "childrens": [
                {
                    "name": "somenam1"
                }
            ],
            "name": "B999"
        }
    ],
    "name": "11111"
},
{
    "childrens": [
        {
            "childrens": [
                {
                    "name": "somename2"
                },
                {
                    "name": "somename3"
                }
            ],
            "name": "B5555"
        },
        {
            "childrens": [
                {
                    "name": "somename4"
                }
            ],
            "name": "B2222"
        }
    ],
    "name": "2222"
}

这只是一个例子,我可以有N个嵌套的孩子。

2 个答案:

答案 0 :(得分:2)

看起来很适合递归:

def flatten(child):
    if not child:
        return child
    return [child['name']] + [name for c in child.get('childrens', []) for name in flatten(c)]

In []:
for child in data:
    print('|'.join(flatten(child)))

Out[]:
11111|B999|somenam1
2222|B5555|somename2|somename3|B2222|somename4

确定您可以通过添加一个level arg并将其返回:

def flatten(child, level=0):
    if not child:
        return child
    return [level] + [l for c in child.get('childrens', []) for l in flatten(c, level+1)]

In []:
for child in data:
    print('|'.join(str(level) for level in flatten(child)))

Out[]:
0|1|2
0|1|2|2|1|2

答案 1 :(得分:0)

这是递归的解决方案

data_json = '[{"childrens":[{"childrens":[{"name":"somenam1"}],"name":"B999"}],"name":"11111"},{"childrens":[{"childrens":[{"name":"somename2"},{"name":"somename3"}],"name":"B5555"},{"childrens":[{"name":"somename4"}],"name":"B2222"}],"name":"2222"}]'

data = json.loads(data_json)

def get_names(data_dict):
  if ("childrens" in data_dict):
    ret_dict = "|".join(map(get_names, data_dict["childrens"]))
    return data_dict["name"] + "|" + ret_dict
  else:
    return data_dict["name"]

def get_all_name(data):
  for i in data:
    print(get_names(i))

get_all_name(data)