簡體   English   中英

Python:扁平化字典列表的最佳方法是什么

[英]Python: What is Best Approach for Flattening a list of Dictionary

如何將帶有嵌套字典的字典列表展平,例如我有以下字典:

data = [
            { 'Name':'xyx',
            'Age':22,
            'EmpDetails':{'Salary':100,'Job':'Intern','Location':'TER'}
            },
            { 'Name':'abc',
                'Age':23,
                'EmpDetails':{'JoinDate':'20110912','Salary':200,'Job':'Intern2','Location':'TER2'}
            },
            {'Name':'efg',
                'Age':24,
                'EmpDetails':{'JoinDate':'20110912','enddate':'20120912','Salary':300,'Job':'Intern3','Location':'TER3'}
            }
       ]

我需要刪除 EmpDetails 節點並將其值向上移動一級,如下所示

data = [
            { 'Name':'xyx','Age':22,'Salary':100,'Job':'Intern','Location':'TER'},
            { 'Name':'abc','Age':23,'JoinDate':'20110912','Salary':200,'Job':'Intern2','Location':'TER2'},
            {'Name':'efg','Age':24,'JoinDate':'20110912','enddate':'20120912','Salary':300,'Job':'Intern3','Location':'TER3'}
       ]

我現在在下面使用,有沒有更快的方法?

newlist = []
for d in data:
    empdict ={}
    for key, val in d.items():
        if(key!='EmpDetails'):
            empdict[key] = val
        if(key=='EmpDetails'):
            for key2, val2 in val.items():
                empdict[key2] = val2
    newlist.append(empdict)

這是使用dict.update.pop一種方法

前任:

data = [
            { 'Name':'xyx',
            'Age':22,
            'EmpDetails':{'Salary':100,'Job':'Intern','Location':'TER'}
            },
            { 'Name':'abc',
                'Age':23,
                'EmpDetails':{'JoinDate':'20110912','Salary':200,'Job':'Intern2','Location':'TER2'}
            },
            {'Name':'efg',
                'Age':24,
                'EmpDetails':{'JoinDate':'20110912','enddate':'20120912','Salary':300,'Job':'Intern3','Location':'TER3'}
            }
       ]

for i in data:
    i.update(i.pop("EmpDetails"))
print(data)

輸出:

[{'Age': 22, 'Job': 'Intern', 'Location': 'TER', 'Name': 'xyx', 'Salary': 100},
 {'Age': 23,
  'Job': 'Intern2',
  'JoinDate': '20110912',
  'Location': 'TER2',
  'Name': 'abc',
  'Salary': 200},
 {'Age': 24,
  'Job': 'Intern3',
  'JoinDate': '20110912',
  'Location': 'TER3',
  'Name': 'efg',
  'Salary': 300,
  'enddate': '20120912'}]

單行方法,可能有點棘手。

data = [
    {
        "Name": "xyx",
        "Age": 22,
        "EmpDetails": {"Salary": 100, "Job": "Intern", "Location": "TER"},
    },
    {
        "Name": "abc",
        "Age": 23,
        "EmpDetails": {
            "JoinDate": "20110912",
            "Salary": 200,
            "Job": "Intern2",
            "Location": "TER2",
        },
    },
    {
        "Name": "efg",
        "Age": 24,
        "EmpDetails": {
            "JoinDate": "20110912",
            "enddate": "20120912",
            "Salary": 300,
            "Job": "Intern3",
            "Location": "TER3",
        },
    },
]

# only python3.5+
res = [{**item.pop("EmpDetails", {}), **item} for item in data]

我更喜歡使用 pandas 庫中的json_normalize()方法,因為這將是一個優雅的解決方案,並且對代碼的可讀性沒有影響。

示例可以在這里看到: https : //pandas.pydata.org/pandas-docs/stable/reference/api/pandas.io.json.json_normalize.html

暫無
暫無

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

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