繁体   English   中英

列表理解和扁平化深度数据结构

[英]List comprehension and flattening deep data structure

可以说我有一个如下所示的数据结构(这大大简化了,我的实际数据在每个日期的每个工作都有大量的特定日期数据):

data = {
    '2019-01-01': {
        'job-1-id': {'name': 'Job 1', 'address': '123 main st.'},
        'job-2-id': {'name': 'Job 2', 'address': '824 1st Ave.'},
    },
    '2019-01-02': {
        'job-1-id': {'name': 'Job 1', 'address': '123 main st.'},
        'job-3-id': {'name': 'Job 3', 'address': '485 Pleasant Rd.'}
    }
}

我想做的是将其展平,将datejob id推送到一组对象。 例如:

data_flat = [
    {'id': 'job-1-id', 'date': '2019-01-01', 'name': 'Job 1', 'address': '123 main st.'},
    {'id': 'job-2-id', 'date': '2019-01-01', 'name': 'Job 2', 'address': '824 1st Ave.'},
    {'id': 'job-1-id', 'date': '2019-01-02', 'name': 'Job 1', 'address': '123 main st.'},
    {'id': 'job-3-id', 'date': '2019-01-02', 'name': 'Job 3', 'address': '485 Pleasant Rd.'},
]

显然,我可以查看并构建一个新数组:

data_flat = []
for date, jobs in data.items():
    for job_id, job in jobs.items():
        data_flat.append({'id': job_id, 'date': date, etc...})

但是,使用列表推导和类似的嵌套数据,是否有更pythonic /有效的方法来做到这一点? 我几乎能想到的是对内部循环使用列表理解,然后使用extend来构建列表,而不是附加列表。 有什么想法吗?

可能的列表理解解决方案可能如下所示,其中我们对job字典进行拆包并向其添加iddate键值对,同时遍历两个for循环

[{**job, 'id': job_id, 'date': date} for date, jobs in data.items() for job_id, job in jobs.items()]

在传统的for循环中,

for date, jobs in data.items():
    for job_id, job in jobs.items():
        data_flat.append({**job, 'id': job_id, 'date': date})

平面列表可以制成通过reduce容易。

所有你需要使用初始化 -第三个参数的reduce作用。

reduce(
 lambda _list, date: _list.extend(
   {'date': date, 'id':_id, **detail} for _id, detail in data[date].items()) or _list, 
 data, 
 [])

上面的代码对python2和python3都适用,但是您需要像from functools import reduce一样导入reduce模块。 有关详细信息,请参见下面的链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM