从嵌套词典创建多个子词典

时间:2018-07-12 04:58:00

标签: python dictionary

我有一个用例,其中我必须创建多个子词典以将嵌套词典拆分为 5 个级别

让我们假设我的字典如下所示。

[{ person: [{
"id" : "abc",
"name" : "xyz",
"address" : {"co-ord" : "123", "place" : "world"},
"previous companies" :[{"comp1" : "name1"}, {"comp2":"name2"}]
}]
}]

现在我需要创建一个列表,例如

[
person:
    {
    "id" : "abc",
    "name" : "xyz",
    }
person_address:{
    "id" : "abc",
    "co-ord" : "123", 
    "place" : "world"
    }
person_companies:
    {
    "id" : "abc",
    [{"comp1" : "name1"}, 
     {"comp2":"name2"}]
    }
    ]

每个子目录都需要一个id字段。我试图遍历嵌套的字典并提取每个值,并将其添加到子字典中,但我什至没有接近解决方案。有没有更好的方法可以做到这一点。

3 个答案:

答案 0 :(得分:1)

mylst=[{ 'person': [{
"id" : "abc",
"name" : "xyz",
"address" : {"co-ord" : "123", "place" : "world"},
"previous companies" :[{"comp1" : "name1"}, {"comp2":"name2"}]
}]
}]
lst=[]
for k,v in mylst[0].items():    
    for ki in (v[0].keys()):
        d={}
        if(ki!='id'):
            d['Id']=v[0]['id']
            d[ki]=v[0][ki]
        if d:
            lst.append(d) 

输出:

[{'Id': 'abc', 'name': 'xyz'},
 {'Id': 'abc', 'address': {'co-ord': '123', 'place': 'world'}},
 {'Id': 'abc', 'previous companies': [{'comp1': 'name1'}, {'comp2': 'name2'}]}]

答案 1 :(得分:1)

遍历所有人员并获取该人员的ID。然后循环浏览除id键以外的所有键。创建具有两个键的字典:idkey,将数据注入到keyid键中。

通过将数据附加到某种数据结构中来存储数据。假设它必须是列表,因为您将有一个以上的人。

data = [{ "person": [{
    "id" : "abc",
    "name" : "xyz",
    "address": {"co-ord" : "123", "place" : "world"},
    "previous companies": [{"comp1" : "name1"}, {"comp2":"name2"}]
    }]
}]

root = {}

for item in data:

    person_data = item['person']

    for person in person_data:

        for key in person.keys():

            if key != 'id':
                sub_dict = {}
                sub_dict[key] = person[key]
                sub_dict['id'] = person['id']

                if not key in root:
                    root[key] = []

                root[key].append( sub_dict )

这将输出包含除id键以外的所有键的字典:字典元素还包含具有两个键的字典列表:实际数据和获取其数据的人员的ID。您可以将内部字典替换为元组(iddata),因为重复键是多余的。

{
'previous companies': [{'previous companies': [{'comp1': 'name1'}, {'comp2': 'name2'}], 'id': 'abc'}], 
'name': [{'name': 'xyz', 'id': 'abc'}], 
'address': [{'id': 'abc', 'address': {'place': 'world', 'co-ord': '123'}}]
}

答案 2 :(得分:0)

您还使用字典理解

 mylst = [{'person': [{"id": "abc", "name": "xyz", "address": {"co-ord": "123", "place": "world"},
                      "previous companies": [{"comp1": "name1"}, {"comp2": "name2"}]}]}]

 print({'Person_' + (z.split())[-1]:[{'id': y['id'], z: y[z]}] for x in mylst for y in x['person'] for z in y.keys() if z != 'id'})

您将获得以下输出:

 {'Person_address': [{'address': {'place': 'world', 'co-ord': '123'}, 'id': 'abc'}], 'Person_name': [{'id': 'abc', 'name': 'xyz'}], 'Person_companies': [{'previous companies': [{'comp1': 'name1'}, {'comp2': 'name2'}], 'id': 'abc'}]}

如果您想用简单的方式写,那就是字典理解

  for x in mylst:
     for y in x['person']:
        for z in y.keys():
            print({'Person_' +(z.split())[-1]: [{'id': y['id'], z: y[z]}]})

现在我希望你了解我的所作所为,但仍然有任何疑问然后问我