簡體   English   中英

從嵌套詞典創建多個子詞典

[英]Create multiple sub dictionaries from a nested 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字段。 我試圖遍歷嵌套的字典並提取每個值,並將其添加到子字典中,但我什至沒有接近解決方案。 有沒有更好的方法可以做到這一點。

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'}]}]

遍歷所有人員並獲取該人員的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'}}]
}

您還可以使用字典理解

 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'}]}

如果您想用簡單的方式寫,那就是Dictionary Comprehensions

  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]}]})

現在我希望你了解我的所作所為,但仍然有任何疑問,然后問我

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM